02. april 2003 - 08:59Der er
10 kommentarer og 1 løsning
MDIChild forms
Jeg laver en MDI-app., hvor det skal være muligt selv at bestemme placering af MDIChild's.
Jeg bruger nu følgende rutine:
Child:= TFCharteque.Create(Self); with Child do begin Top:=0; Left:=50; Width:=905; Height:=272; end;
Dette flytter naturligvis Child, men medfører flimmer på skærmen. Meningen er at Child skal dukke op med rigtig størrelse på det rigtige sted med det samme?
Hvordan refererer jeg videre hen i programmet til nøjagtig denne form?
Hvordan får jeg fundet formens indeks (MDIChildren[I])?
1: Brug SetBounds i stedet for at sætte en property ad gangen... 2: Child := Form1.MDIChildren[I]; Child.Caption := 'Du har fat i mig!'; Child.Close; //bla bla bla
Jeg er stadig ret ny mht Delphi. 1: Kan du give mig et eksempel på brugen af setbounds ? 2: Jeg er klar over, at jeg kan benytte MDIChildren[I] for at referere til den enkelte Child, men problemet er, at der kan være flere forskellige Child's åbne af gangen. Hvis jeg så f.eks ved tryk på en knap på Child1 vil flytte fokus til en editboks på Child2 er det vel nødvendigt, at jeg kender de enkelte Childs indekser - så hvordan finder jeg ud af, hvilket indeks (I) ved benyttelse af MDIChildren[I] den enkelte form har ?
Jeg håber, at jeg har udtrykt spørgsmålet nogenlunde forståeligt.
Jeg tror jeg skal bruge noget mere kode for at kunne hjælpe dig med oprettelsen af din form... Send mig lige hele proceduren!
Omkring MDIChildren[I], så er det letteste i første ombæring nok at køre i gennem et loop og se om det er den rigtige form:
var I: Integer; Child: TForm; begin for I := 0 to MDIChildCount -1 do if MDIChildren[I].Caption := 'Det her er formens Caption, det kan også være en anden værdi du går ud fra.' then begin Child := MDIChildren[I]; Break; end; Child.Caption := 'Du har fundet mig!!'; end;
Her er koden. Variablen ChartWin er en global variabel af typen Boolean. Den benyttes til at kontrollere, at der kun oprettes en Child af typen TFCharteque. ChartWin variablen bliver igen sat til False i FCharteque's FormClose event. Alt dette kunne måske også gøres smartere ??
Det er måske en bagatel, men når proceduren kører fremkommer formen først som et glimt et andet sted på skærmen inden den får sin korrekte størrelse og placering som anført i SetBounds.
procedure TForm1.AabnChartequeExecute(Sender: TObject); var Child: TFCharteque; begin if not ChartWin then ChartVin:=True; Child:= TFCharteque.Create(Self); Child.SetBounds(50,0,905,272); end; end;
Din procedure omkring MDIChildren ser fin ud - så du får under alle omstændigheder pointene.
Hvad sker der når din TFCharteque kører Create-constructoren? Kører den Show-proceduren med det samme, eller hvad? Ellers så prøv at sætte Form1.DoubleBuffered := True; det kan være det hjælper...
Evt. kan du du først køre Child.Hide; Hvad er det helt præcist der flimrer? Er det hele formen, eller kun dit Child? Har du lavet din egen constructor til formen, eller sat noget den skal gøre under OnCreate?
Child.Hide; giver fejlmeldingen "Cannot hide an MDI Child Form".
Jeg har kun problemet med mit Child. Jeg tror det sker når linien "Child:= TFCharteque.Create(Self);" kører. Så dannes Child'et et bestemt sted på skærmen, hvor man lige kan nå at se det inden linien "Child.SetBounds(50,0,905,272);) flytter og resizer Childet. Dvs. man når lige at se et glimt af formen inden den bliver flyttet på plads.
Dette vil jeg gerne undgå.
MDI formens constructor er ganske almindelig, og der bliver intet gjort under OnCreate.
Hvis du alligevel skal bruge de enheder fra starten, kunne du så ikke sætte dem direkte på formen? :) Altså sæt dine properties under design-time. En anden ide var at minimere formen først, eller at have den minimeret fra design-time og så oprette den og kalde Restore, eller hvad det er nu er den hedder...
Det hjælper ikke at sætte properties under design-time. Problemet ligger i, at MDI formen automatisk placerer første Child i øverste højre hjørne og de næste Child's lettere forskubbet mod højre og nedad (som en kaskade). Childen vises så i et kort øjeblik, inden den flyttes på plads med Child.SetBounds. Jeg tror man skal finde en metode, hvor man kan overstyre formens automatiske placeringer af Child's.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.