Har en fundering; finns det något sätt via reflection eller annat att se om en viss funktion kommer öppna ett formulär, vilket som helst? Och även messagebox etc. Hm, låter inte helt enkelt.. Rent teoretiskt borde du kunna få ut vilka funktionsanrop, variabler etc som en viss funktion kan komma att anropa, men.. Jag ser mest en massa problem: om det finns en if-sats, som beroende på omständigheter, kan komma att starta någonting kul? Nästlade funktioner? Triggar ett manualresetevent som får en annan tråd att vakna till och visa ett fönster? <b>>Jag ser mest en massa problem: om det finns en if-sats, som beroende på omständigheter, kan komma att starta någonting kul?</b> Hm.. Jag har en idé: Där fick jag dock en lite kul idé :) Har en fundering; finns det något sätt via reflection eller annat att se om en viss funktion kommer öppna ett formulär, vilket som helst? Och även messagebox etc. <b>>I vilket fall som helst så kanske det här fungerar: när det eventet körs, ta upp callstacken och titta lite?</b> Till att börja med är min stora fundering det där med vem som anropar visiblechanged. Jag är lite rädd att det är messageloopen, och då lär du nog inte hitta någon rolig callstack :/ Jag är inte säker på att jag behöver callstacken alls. Poängen är mer att veta om att ett fönster är igång och synligt och går att interagera med. Ah, ok, om callstacken inte är ett krav så.. :) ... och då borde jag väl även få med typ messageboxar? Det är inga vanliga forms, är win32-fönster (precis som typ savefile etc), du lär ju få handlen till dem, men du kan inte koppla dem till något form Jävlar, då borde jag ju inte heller kunna iterera genom kontrollerna på något enkelt sätt. Å andra sidan kanske man kan identifiera de fallen och trycka på ok eller cancel via något meddelande, för att bli av med alla såna fönster, alternativt bara slänga in någon kodsnutt runt varje messagebox.show för min andra kod, typ: Du kan ju iterera fönstren om du vill, även om du inte kan det med .net. Fast du kan nog inte göra det i samma ögonblick som de skapas eftersom att bara själva fönstret är skapat då, inte alla kontroller i fönstretSe om ett event (eller funktion etc.) öppnar form?
Alltså om jag har en funktion som får in ett delegat som input, (halvpseudo, orkar inte skriva vettigt):
do_f(delegate f)
{
f();
}
och man anropar den med f1 och f2;
f1()
{
int a= 5;
}
f2()
{
form1.show()
}
Kan jag då i do_f, få reda på detta, typ:
do_f(delegate f)
{
if(f.opens(form1)) //funkar naturligtvis inte.
debugprint("Öppnar form 1");
f();
}
Och ännu hellre, går det att få tag på att det är just form1? (Och ja, det är just så här jag behöver göra.)Sv: Se om ett event (eller funktion etc.) öppnar form?
Är du helt säker på att det är så du måste göra? Vems funktioner är det? Finns det möjlighet att deklarera attribut på funktionerna som ska visa fönster?Sv:Se om ett event (eller funktion etc.) öppnar form?
Du har definitivt en poäng där, i synnerhet med andra trådar, men låt säga att vi bara har en huvudtråd där.
Jag kan inte förklara alltihop, men jag skulle kunna hitta på en ungefärlig motsvarighet:
Låt säga att vi i början av "do_f" startar en tråd som kommunicerar med någon slags panel i ett annat program, och att den hela tiden visar en lista på vilka fönster som just nu är öppnade av do_f. Hemskt gärna huruvida de är modala eller inte, också. Hur skulle man kunna göra det?
Eller något sånt här:
Vi har en funktion, som utifrån ett slumptal öppnar en av fem olika forms (alt. ingen alls). Jag vill nu lägga på någon typ av yttre komponent som dels förstår vilket formulär som öppnas, och dels kan fylla i och stänga formulären, efter de har blivit öppnade.
<b>>Är du helt säker på att det är så du måste göra?</b>
Helt säker är man aldrig, men med ovanstående, har du något annat förslag?
<b>>Vems funktioner är det? Finns det möjlighet att deklarera attribut på funktionerna som ska visa fönster?</b>
Jag har full kontroll på allting, det är mina funktioner och formulär, men jag vill ändå minimera tillägg på dem i den mån det går.
Förstår att det kan låta lite skumt, men det är helt legitimt, vettigt och genomtänkt.Sv: Se om ett event (eller funktion etc.) öppnar form?
Vad tror du om att installera en hook? http://msdn.microsoft.com/en-us/library/ms644990(VS.85).aspx Du kan sätta den på huvudtråden, och be att fånga alla meddelanden som ska till fönstren för den tråden? Fånga WM_CREATE eller vad det nu heter, efter att det meddelandet är processat. Sedan kan du nog använda den statiska metoden Control.FromHandle för att få ut vilken kontroll det är frågan om. På så sätt kan du nog hålla en uppdaterad lista över alla fönster utan att för den skull behöva slösa en massa cpu på att loopa i tid och otid.
Har dock inte kommit på hur man ska veta vilken metod som visar fönstret än..Sv:Se om ett event (eller funktion etc.) öppnar form?
Om du i samma veva där ansluter dig till eventet VisibleChanged eller annat lämpligt event..? Jag vet inte riktigt hur det där fungerar, om det eventet triggas via window messages eller "från kod" dock, men jag är rädd för att det är via window messages. I vilket fall som helst så kanske det här fungerar: när det eventet körs, ta upp callstacken och titta lite?Sv: Se om ett event (eller funktion etc.) öppnar form?
..det där låter ju misstänkt likt haltningsproblemet http://en.wikipedia.org/wiki/Halting_problemSv:Se om ett event (eller funktion etc.) öppnar form?
Du är nog inne på rätt spår, Oskar!
Låt säga att jag manuellt utökar varje form.VisibleChanged med ett anrop som uppdaterar min externa panel, typ:
FormX_VisibleChanged()
UpdateExternalPanel(me)
FormY_VisibleChanged()
UpdateExternalPanel(me)
...
I så fall borde jag ju, utan att hooka, kunna göra detta allra först i koden; loopa igenom alla forms i programmet, köra en addevent på alla form.visiblechanged - inte sant?
Och i så fall räcker det ju att labba fram en lösning som funkar genom att manuellt lägga till grejerna först. Mitt slutprojekt blir nog inte superstabilt, men jag tror det funkar för mina behov.
Simon:
Det är möjligt att det är likt, men jag har arbetat lite grann med halting problem, och man ska ha klart för sig att dess betydelse är lite överdriven. Med vettiga avgränsningar har man inte något problem med att undgå det; jag hävdar att jag har just såna avgränsningar här. (Dock en bra poäng, det är förstås lämpligt att se om det överhuvudtaget är möjligt att lösa först ;) ) Sv: Se om ett event (eller funktion etc.) öppnar form?
I vilket fall som helst, du kan bara hooka dig på instanser av forms som redan är skapade, men de skapas kanske alla på en gång?Sv:Se om ett event (eller funktion etc.) öppnar form?
<b>>I vilket fall som helst, du kan bara hooka dig på instanser av forms som redan är skapade, men de skapas kanske alla på en gång?</b>
Där har du förstås en poäng, så långt tänkte jag inte. Och för att faktiskt kontrollera när de skapas så kommer vi ju tillbaks till grundproblemet. Ja, okej, men låt säga att jag accepterar att lägga det manuellt i Visiblechanged, då räcker ju det. Jag kan leva med ett sånt extra steg. Sv: Se om ett event (eller funktion etc.) öppnar form?
Då föreslår jag nog en hook, då får du ju som sagt reda på när fönstren blir skapade, och kan då koppla på Visible.Changed :)Sv:Se om ett event (eller funktion etc.) öppnar form?
Känns lite weird att få tag på dem... är de vanliga forms som bara är lite överlagrade och shadow:ade?Sv: Se om ett event (eller funktion etc.) öppnar form?
Sv:Se om ett event (eller funktion etc.) öppnar form?
"Blunda nu"
messagebox.show(...)
"Okej, du kan titta igen"Sv: Se om ett event (eller funktion etc.) öppnar form?