![]() |
Objekte Bewegen
Hey, ich habe mal wieder eine Frage/Problem.
Ich habe einen Button, btnMove, wenn ich den drücke dann kann ich auf ein Objekt, z.B. Label, Editfeld oder Memo, drücken um dieses zubewegen. Bei einem Textfeld funktioniert das auch, aber nicht bei einem Label. Da kommt dann ein Fehler bei meinControl.Left:=..... Warum geht das nicht bei einem Label?? Hier der Move Code
Delphi-Quellcode:
procedure TForm3.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); var meinControl: TWinControl; j : integer; //Schleifen Variable begin MDown:=true; if move=true then begin if (Sender is TWinControl) then if (Sender<>Form3) then meinControl := (Sender as TWinControl) else Exit; while MDown=true do begin meinControl.Left:=(Mouse.CursorPos.x-Form3.Left-Form3.BorderWidth); //Hierhin verweist die Fehlermeldung meinControl.Top:=(Mouse.CursorPos.y-Form3.Top-50); //Form3.Refresh; Application.ProcessMessages; for j:=3 to Memo1.Lines.Count do begin if Memo1.Lines[j]=meinControl.Name then begin Memo1.Lines[j+2]:=(inttostr(meinControl.BoundsRect.Left)); Memo1.Lines[j+3]:=(inttostr(meinControl.BoundsRect.Top)); Memo1.Lines[j+4]:=(inttostr(meinControl.Width)); Memo1.Lines[j+5]:=(inttostr(meinControl.Height)); end; end; end; end else Exit; end; |
AW: Objekte Bewegen
Abgesehen davon, dass ein TLabel kein TWinControl ist: unterliegt die Fehlermeldung der Geheimhaltung, oder wieso nennst Du sie nicht?
|
AW: Objekte Bewegen
Genau, weil TLabel kein WinControl ist wird auch dein meinControl in dem Moment nicht zugewiesen. Sieht man besser wenn der Code ordentlich formatiert ist. Witziger Weise bewegt sich bei mir das Label obwohl es nie auf meinControl zugewiesen wird :shock:
|
AW: Objekte Bewegen
Liste der Anhänge anzeigen (Anzahl: 1)
Hier ist mal des Programm. Ich kann leider grad nicht den genauen Inhalt der Fehlermeldung sagen, da ich gerade kein Lazarus auf dem Computer habe.
Ich kann es erst später sagen. Falls ihr das Problem jetzt lösen wollt könnt ja mal selber schauen was passiert. Hier müsstet nur kurz in der Unit Newformframe beim erstellen des Labels Enabled:=true setzen, zur Zeit setht das drin:
Code:
Wenn ihr das programm dann starte, müsst ihr folgendes machen:
Label1.Enabled:=false;
1. Formular Reiter öffnen 2. Formular Button drücken 3. Eigene Reiter öffnen 4. Neues Formular Button drücken 5. Label erstellen (also Label Button drücken und etwas in das Textfeld "Befehlsname" eingeben und dann auf das andere (fast leere) Fenster klicken) 6. Im kleinen Fenster den Move Button drücken und auf das, eben erstellte, Label klicken und dann koommt der fehler Vielen dank ich melde mich nochmal wenn ich Lazarus zur Verfügung habe. |
AW: Objekte Bewegen
Liste der Anhänge anzeigen (Anzahl: 2)
Hier ist mal ein Bild von dem Fehler, und eines von der Zeile auf welche der Fehler verweist
|
AW: Objekte Bewegen
Und wenn Du
Zitat:
Delphi-Quellcode:
änderst? Sonst kann es nämlich passieren, dass in Deiner meinControl-Variablen irgendwelcher Müll drinsteht, da knallt es dann beim Zugriff darauf.
if (Sender is TWinControl) and (Sender<>Form3) then
meinControl := (Sender as TWinControl) else Exit; [edit] Oder mal im Ganzen ohne unnötige Klammern, Boolean-Vergleiche, Zugriffe auf die globale Form-Variable und Schreiben über die Zeilenanzahl des Memos hinaus, dafür aber mit Einrückungen:
Delphi-Quellcode:
[/edit]
procedure TForm3.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); var meinControl: TControl; j : integer; //Schleifen Variable begin MDown := true; meinControl := nil; if move then begin if Sender is TControl then if Sender <> self then meinControl := Sender as TControl; if not Assigned(meinControl) then exit; while MDown do begin meinControl.Left := Mouse.CursorPos.x - Left - BorderWidth; meinControl.Top := Mouse.CursorPos.y - Top - 50; Application.ProcessMessages; for j := 3 to Memo1.Lines.Count - 6 do begin if Memo1.Lines[j] = meinControl.Name then begin Memo1.Lines[j + 2] := inttostr(meinControl.BoundsRect.Left); Memo1.Lines[j + 3] := inttostr(meinControl.BoundsRect.Top); Memo1.Lines[j + 4] := inttostr(meinControl.Width); Memo1.Lines[j + 5] := inttostr(meinControl.Height); end; end; end; end; end; |
AW: Objekte Bewegen
Hey DeddyH,
du hast in deinem letzten Quelltext ausschnitt nur
Delphi-Quellcode:
geschrieben! Warum nicht move=true??
if move then
|
AW: Objekte Bewegen
![]() ![]() |
AW: Objekte Bewegen
Liste der Anhänge anzeigen (Anzahl: 1)
Wow vielen dank das ist mal echt interessant.
Zu deinen beiden Lösungsmöglichkeiten, die funktionieren beide nicht: der erste geht zwar aber man kann ein Label nicht auswählen (obwohl enabled), was wahrscheinlich daran liegt das, wie ihr mir ja schon gesagt habt, kein TWinControl ist. der zweite Quelltext verursacht ein Fehler in der Zeile:
Delphi-Quellcode:
Fehler siehe Bild
meinControl := Sender as TControl;
|
AW: Objekte Bewegen
Und bei
Delphi-Quellcode:
:?:
meinControl := TControl(Sender);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz