Avatar billede leifj Nybegynder
02. april 2003 - 08:59 Der 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])?
Avatar billede hermandsen Juniormester
02. april 2003 - 19:35 #1
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

3: Hvad mener du med at finde formens indeks?
Avatar billede leifj Nybegynder
03. april 2003 - 08:41 #2
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.
Avatar billede leifj Nybegynder
03. april 2003 - 08:54 #3
Jeg fandt ud af det med SetBounds, men det løser ikke problemet helt.

Man kan stadig et kort øjeblik se formen dukke op et andet sted på skærmen inden den får sin rigtige placering, hvordan undgår jeg dette ?
Avatar billede hermandsen Juniormester
03. april 2003 - 10:27 #4
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;
Avatar billede leifj Nybegynder
03. april 2003 - 11:15 #5
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.
Avatar billede hermandsen Juniormester
03. april 2003 - 11:25 #6
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...
Avatar billede leifj Nybegynder
03. april 2003 - 11:50 #7
Ja, det ser ud til at den kører show-proceduren med det samme, kan man undgå det ?

Form1.DoubleBuffered:=True; Hjælper ikke
Avatar billede hermandsen Juniormester
03. april 2003 - 14:38 #8
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?
Avatar billede leifj Nybegynder
03. april 2003 - 15:55 #9
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.
Avatar billede hermandsen Juniormester
03. april 2003 - 23:54 #10
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...
Avatar billede leifj Nybegynder
04. april 2003 - 08:51 #11
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.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester