Avatar billede slowaterz Nybegynder
28. august 2001 - 09:41 Der er 8 kommentarer og
3 løsninger

Runtime Resize

Jeg har haft lidt bøvl med at få lavet min OnFormResize procedure. Min form skal kunne strækkes men kun i 10 pixels intervaller. D.v.s. når man har trukket i kanten skal der rundes ned til nærmeste \"rund\" bredde. Men når jeg prøver at regne den nye bredde ud og sætte den manuelt i koden opstår der endnu en OnResize event og jeg havner i en løkke. Jeg vil gerne have nogen råd. Jeg har leget lidt med OnCanResize og OnConstrainedResize men kom ingen vejne der. Så vidt jeg kan se, opstår der også en OnResize ved starten af programmet (startværdien for bredden ændres dog ikke, når den kommer igennem min formel, så her kommer jeg ikke ind i løkken).
Avatar billede lectoc Nybegynder
28. august 2001 - 09:46 #1
Du kan fx lave en private object variabel i din form - et flag du sætter til true, når det er dit event, der laver en resize.

Din event-metode kunne så fx se ud som følger:

...
begin
  if FEventResizing then
    exit;
  FEventResizing:= true;
  try
    <din udregning af størrelse>
  finally
    FEventResizing:= false;
  end;
end;
Avatar billede slowaterz Nybegynder
28. august 2001 - 10:21 #2
Jeg overvejet en lignende løsning men vil hellere udnytte de muligheder, der ligger i OnCanResize eller OnConstrainedResize (hvis det overhovedet er muligt).
Avatar billede delphi Nybegynder
29. august 2001 - 11:17 #3
Letoc\'s svar er faktisk lidt morsomt.  Første gang virker rutinen fint (forudsat at FEVent... er initialiseret til false).  Derefter vil man exite hver eneste gang uden af få lavet en dyt....

Peter
Avatar billede lectoc Nybegynder
29. august 2001 - 11:20 #4
Det skulle da helst ikke være tilfædet !! Du har vist lavet en kode-fejl.

Jeg sætter jo netop FEventRisizing til false i finally blokken....

Så det er nok snarere noget morsomt, du har lavet i din kode...
Avatar billede delphi Nybegynder
29. august 2001 - 11:20 #5
Bortset fra det er svaret som sådan ok - Jeg laver ofte noget lignende, hvor jeg normalt vælger at bruger en typed constant.  Så\'en ud af hovedet gør jeg noget i retning af:

Procedure.....
Const
  IsActive : Boolean = False;
Begin
  If IsActive Then
    IsActive := False
  Else
    Begin
      IsActive := True;

      FooBar(Alle dine argumenter);
    End;
End;


Nemt, simpelt, resource venligt og meget overskueligt....

Peter

Avatar billede delphi Nybegynder
29. august 2001 - 11:22 #6
Letoc: Det er meget fint at du har sat din False tilskrivning i Finally delen, men i betragtning af at du exiter FØR du kommer ind i Try delen, så sker der altså ikke en sk*d. 

check din kode inden du er for hurtig påaftrækkeren....

Peter
Avatar billede lectoc Nybegynder
29. august 2001 - 12:08 #7
Peter...

Jeg exit\'er kun, hvis FEventResizing er TRUE. Denne variabel skal initielt sættes til FALSE. Når event-koden kører, sættes den til TRUE, den resterende del af koden køres, og man skal så sørge for, at den igen sættes til FALSE (i finally delen).

Man skal selvfølgelig sørge for ikke fx at kalde exit, inden finally nås. Jeg ved ikke om det er det, der er dit problem...?? Jeg mener ikke, jeg var for hurtig på aftrækkeren...!

Torben.
Avatar billede slowaterz Nybegynder
29. august 2001 - 12:30 #8
Torben, Peter - jeg vil ikke fremstå som utaknemmelig for jeres hjælp, men det er mere mulighederne i håndteringen af OnCanResize og OnConstrainedResize events, jeg ville vide noget om.
Delphis online hjælp nævner mulighederne for finjusteringer men giver ikke meget at gå efter.
Avatar billede lectoc Nybegynder
29. august 2001 - 12:41 #9
Okay, okay...

Så vidt jeg kan se, kan du ikke bruge de omtalte events til det, du ønsker. OnConstrainedResize bruges til at angive en max hhv. min højde og bredde.

OnCanResize kan du bare bruge til at sige, at formen slet ikke må resizes i nogle situationer.

Så du må nok \"nøjes\" med mit første forslag.... Hvad er der også galt i det, hvis det virker??

/Torben.
Avatar billede olejorgensen Nybegynder
18. september 2001 - 17:41 #10
Prøv f.eks.

Form1 = Class(TForm)
...
    Procedure AfterResize(var Msg: TMessage); message WM_EXITSIZEMOVE;
... 

procedure TForm1.AfterResize(var Msg: TMessage);
begin
  Height:=(Height Div 10)*10;
  Width:=(Width Div 10)*10;
end;
Avatar billede slowaterz Nybegynder
22. oktober 2001 - 10:49 #11
Jeg koger alle tre svar sammen til en mellemløsning ... Tak for hjælpen
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