Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Flackern bei onshow vehindern (https://www.delphipraxis.net/90967-flackern-bei-onshow-vehindern.html)

wfs12 26. Apr 2007 17:38


Flackern bei onshow vehindern
 
Guten tag allerseits,
Ich habe ein Problem ich habe eine Form auf der ich ein paar Rechtecke auf das Canvas gezeichnet habe wenn ich mit der Maus nun über eins dieser Rechtecke komme möchte ich gerne ein popup zeigen dass informationen zu diesem Rechteck enthält die Koordinaten des Rectecks habe ich in einem Array gespeichert. klappt auch alles bestens. als popup zeige ich eine zweite form an (show) jetzt ergibt sich bei meinem quellcode folgendes Problem das Fenster beginnt zu flackern weil ich hiermit sowas wie eine endlosschleife konstruiert hab. Wuie kann ich das lösen?
Delphi-Quellcode:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  i:integer;
begin
  for i:=0 to max-1 do
    if (x>PosArray[i,1]) and (x<PosArray[i,3]) and (y>PosArray[i,2]) and (y<PosArray[i,4]) then begin
      hintid:=PosArray[i,0];
      if not Form4.Showing=true then
        Form4.Show;
      Form4.Left:=X+200;
      if Y<150 then
        Form4.Top:=Y+150
      else if clientheight-Y<170 then
        Form4.top:=Y-170
      else Form4.top:=Y;
   end else Form4.Hide;
end;
Danke im Vorraus!

hoika 26. Apr 2007 19:36

Re: Flackern bei onshow vehindern
 
Hallo,

ich würde das Form immer "zentriert" zum Rechteck anzeigen,
also immer an der gleichen Stelle für das betreffende Rechteck.

Dann muss das Rechteck nur einmal angezeigt und plaziert werden.

Ausserdem solltest du mal probieren,
bei deinem Rechteck-Form DoubleBuffered auf True zu setzen (z.B. im FormCreate).


Heiko

Geronimo 26. Apr 2007 20:07

Re: Flackern bei onshow vehindern
 
...
Hier werden im MouseMove Ereignis immer alle Rechtecke durchgerödelt.
Ich würde zum Zeichnen der Rechtecke eine geeignete Kompo mit Rand und
MouseMove Ereignis nehmen.
Vorteil: Sender ist gleich ohne Rödeln das richtige Rechteck.

Weiter: Top und Left des Popups erst richtig einstellen, dann anzeigen.

Gruß

wfs12 26. Apr 2007 20:25

Re: Flackern bei onshow vehindern
 
hmm das problem ist aber das das popup mit der maus "wandern" soll. deshalb ist das
Zitat:

ich würde das Form immer "zentriert" zum Rechteck anzeigen,
also immer an der gleichen Stelle für das betreffende Rechteck.

Dann muss das Rechteck nur einmal angezeigt und plaziert werden.
und das
Zitat:

Weiter: Top und Left des Popups erst richtig einstellen, dann anzeigen.
schlecht machbar für mich. Double Buffered hab ich auf true gesetz ist zwar schon nen bisschen besser aber die endlosschleife ist ja logischerweise immernoch da

hoika 26. Apr 2007 20:45

Re: Flackern bei onshow vehindern
 
Hallo,

tja,

dann kannst du das wohl nur selber malen
auf dem Rechteck-Form selber.


Heiko

wfs12 26. Apr 2007 20:51

Re: Flackern bei onshow vehindern
 
:'(

hoika 26. Apr 2007 20:58

Re: Flackern bei onshow vehindern
 
Oder du merkst dir die letzte Position des Forms und änderst sie
nur, wenn die Maus z.B. mindestens 3 Punkte weiterbewegt wurde.


Heiko

wfs12 26. Apr 2007 21:13

Re: Flackern bei onshow vehindern
 
ne bringt leider auch nichts weil wenn ich ja die popup form zeige dann bin ich ja nicht mehr auf meiner normalen form also zählt da mouseover auch nicht mehr

hoika 26. Apr 2007 21:40

Re: Flackern bei onshow vehindern
 
Hallo,

[/delphi]

Pseudo-Code

type
TForm1
// das sind Form-Variablen
iCurLeft: Integer;
iCurTop: Integer;


procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
i:integer;
iLeft, iTop: Integer;
bPosChanged: Boolean;

begin
bPosChanged:= Fklse;
for i:=0 to max-1 do
if (x>PosArray[i,1]) and (x<PosArray[i,3]) and (y>PosArray[i,2]) and (y<PosArray[i,4]) then begin
hintid:=PosArray[i,0];
if not Form4.Showing=true then
Form4.Show;

iLeft:= X+200;
iTop:= Y+150;

// 3 ist ein Beispiel
// Diff mussu mal selber coden
// iLeft kann groesser werden (Maus nach rechts) oder kleiner)
// Diff:= Abs(iLeft,iCurLeft)
// habe gerade keine Lust mehr zum guggern

if Diff(iLeft, iCurLeft)>3 then
begin
iCurLeft:= iLeft;
bPosChanged:= True;
end;
// mit Top das gleiche

und dann

if bPosChanged then
begin
Form.Left:= iCurLeft;
Form.Top := ...
end;
end;

[delphi]

Damit wird das Neupositionieren nur dann gemacht,
wenn die Maus sich ein bissel mehr bewegt hat.


Heiko

insert hoika into bett
delete hoika from arbeitsplatz

Hawkeye219 26. Apr 2007 22:03

Re: Flackern bei onshow vehindern
 
Hallo,

vielleicht genügen bereits kleine Änderungen an deinem Code:

Delphi-Quellcode:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  i:integer;
begin
  for i:=0 to max-1 do
    if (x>PosArray[i,1]) and (x<PosArray[i,3]) and (y>PosArray[i,2]) and (y<PosArray[i,4]) then begin
      hintid:=PosArray[i,0];
      Form4.Left:=X+200;
      if Y<150 then
        Form4.Top:=Y+150
      else if clientheight-Y<170 then
        Form4.top:=Y-170
      else Form4.top:=Y;
      Form4.Show;
      Exit;
    end;
  Form4.Hide;
end;
Gruß Hawkeye


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:29 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz