AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Objekte Bewegen

Ein Thema von Finki · begonnen am 19. Aug 2013 · letzter Beitrag vom 22. Aug 2013
Antwort Antwort
Seite 1 von 3  1 23      
Finki

Registriert seit: 2. Jul 2013
120 Beiträge
 
FreePascal / Lazarus
 
#1

Objekte Bewegen

  Alt 19. Aug 2013, 06:31
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;
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Objekte Bewegen

  Alt 19. Aug 2013, 07:02
Abgesehen davon, dass ein TLabel kein TWinControl ist: unterliegt die Fehlermeldung der Geheimhaltung, oder wieso nennst Du sie nicht?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
CarlAshnikov

Registriert seit: 18. Feb 2011
Ort: Erfurt
108 Beiträge
 
Delphi XE5 Enterprise
 
#3

AW: Objekte Bewegen

  Alt 19. Aug 2013, 07:09
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
Sebastian
  Mit Zitat antworten Zitat
Finki

Registriert seit: 2. Jul 2013
120 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Objekte Bewegen

  Alt 19. Aug 2013, 07:46
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:
Label1.Enabled:=false;
Wenn ihr das programm dann starte, müsst ihr folgendes machen:

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.
Angehängte Dateien
Dateityp: zip Neu.zip (4,54 MB, 5x aufgerufen)
  Mit Zitat antworten Zitat
Finki

Registriert seit: 2. Jul 2013
120 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Objekte Bewegen

  Alt 19. Aug 2013, 15:34
Hier ist mal ein Bild von dem Fehler, und eines von der Zeile auf welche der Fehler verweist
Miniaturansicht angehängter Grafiken
fehler.png   zeile.png  
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Objekte Bewegen

  Alt 19. Aug 2013, 15:48
Und wenn Du
Zitat:
Delphi-Quellcode:
if (Sender is TWinControl) then
 if (Sender<>Form3) then
 meinControl := (Sender as TWinControl)
 else
 Exit;
mal in
Delphi-Quellcode:
if (Sender is TWinControl) and (Sender<>Form3) then
  meinControl := (Sender as TWinControl)
else
  Exit;
änderst? Sonst kann es nämlich passieren, dass in Deiner meinControl-Variablen irgendwelcher Müll drinsteht, da knallt es dann beim Zugriff darauf.

[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:
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;
[/edit]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen

Geändert von DeddyH (19. Aug 2013 um 16:30 Uhr)
  Mit Zitat antworten Zitat
Finki

Registriert seit: 2. Jul 2013
120 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Objekte Bewegen

  Alt 20. Aug 2013, 06:50
Hey DeddyH,

du hast in deinem letzten Quelltext ausschnitt nur   if move then geschrieben! Warum nicht move=true??
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Objekte Bewegen

  Alt 20. Aug 2013, 07:00
http://www.delphi-treff.de/tutorials...faengerfehler/ oder auch http://www.detlef-heibing.de/program...onstanten.html, das sollte die Frage beantworten.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Finki

Registriert seit: 2. Jul 2013
120 Beiträge
 
FreePascal / Lazarus
 
#9

AW: Objekte Bewegen

  Alt 20. Aug 2013, 07:12
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:

     meinControl := Sender as TControl; Fehler siehe Bild
Miniaturansicht angehängter Grafiken
faehlere.png  
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Objekte Bewegen

  Alt 20. Aug 2013, 07:17
Und bei
meinControl := TControl(Sender);
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:15 Uhr.
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