Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Parent Abfrage (https://www.delphipraxis.net/180165-parent-abfrage.html)

Antonov 27. Apr 2014 11:30

Parent Abfrage
 
Hallo.

Ich hantiere schon seit zwei Tagen mit dem Problem herum, dass ich eine simple Abfrage nicht durchführen kann.
Foren und Internet haben mich nicht sonderlich weiter gebracht ... wahrscheinlich liegt es wieder an einem trivialen Fehler oder ich bin zu blöd (ich bin etwa 4 Wochen alt, was Delphi Kenntnisse angeht).

Folgender Sachverhalt:
Ich habe vor, sagen wir, ein Bild zu bewegen mit MouseDown/Move/Up. Jetzt möchte ich Bilder, die auf einer Scrollbox liegen, NUR in X-Richtung hin und her schieben, und alle anderen Bilder (die auf der Form liegen) in beide Richtungen.
Dazu habe ich mir eine Abfrage gebastelt, die schaut, wer das Parent des jeweiligen Bildes ist.
Dort ist der Haken.
Delphi-Quellcode:
procedure TForm1.CustomImageMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);    //CustomImageMouseDown/Move ist die custom Procedure für mehrere Bilder
begin
        MoveTag:= TImage(Sender).Tag;
        MovingImage:= CardPanel[MoveTag];    //das Image liegt auf einem Panel drauf, also MovingImage ist eig. das Panel
        MouseMoveDown := true;
        GetCursorPos(OldPos);
        DiffX := OldPos.X - MovingImage.Left ;
        DiffY := OldPos.Y - MovingImage.Top ;
end;

procedure TForm1.CustomImageMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
      GetCursorPos(OldPos);
     if MouseMoveDown = true then
     begin
         MovingImage.Left := OldPos.X - DiffX ;       //Immer in X-Richtung
         if GetParent(MovingImage.Handle) is ((P1Scrollbox) or (P2Scrollbox)) then
          begin
           MovingImage.Top := OldPos.Y - DiffY;      //Nur wenn NICHT auf einer ScrollHand
          end;
     end;
end;
Der Compiler sagt:
"[Pascal Fehler] MovingImages.pas(511): E2015 Operator ist auf diesen Operandentyp nicht anwendbar."
Der Fehler liegt laut Compiler in der If Parent Abfrage.
Ich habe gehört, dass man das .Handle irgendwie braucht, aber so richtig bin ich da nicht durchgestiegen.

Die Lösung des Problems ist für mich nicht lebenswichtig, da ich immer noch "schummeln" könnte, und in den Hint jedes Objektes einfach sein Parent (oder irgendein Erkennungsmerkmal) reinschreibe beim Erzeugen zur Laufzeit. Aber ich halte das nicht für Elegant, außerdem habe ich nicht unendlich viele Hint-Plätze pro Objekt zur Verfügung. :D

Wenn das Problem wirklich zu trivial ist oder per Tutorial zu lösen wäre, schlagt zu und schickt mich zu den Tutorials zurück!
...aber ich freue mich gerne über Beiträge! :D

DeddyH 27. Apr 2014 11:45

AW: Parent Abfrage
 
Versuch es mal mit
Delphi-Quellcode:
if (MovingImage.Parent = P1Scrollbox) or (MovingImage.Parent = P2Scrollbox) then
(* Dummy-Zeile für den Parser der DP *)
GetParent ist eine API-Funktion und gibt Dir nur das Handle des ParentControls zurück. Parent hingegen ist eine Eigenschaft von TControl und liefert Dir die tatsächliche Instanz. Mit is prüft man übrigens, ob ein Objekt von einer bestimmten Klasse abstammt, aber nicht, ob es eine bestimmte Instanz ist.

P.S: Bitte niemals(!!) auf true prüfen, das kann ins Auge gehen.

Antonov 27. Apr 2014 11:51

AW: Parent Abfrage
 
Ach ja, bin ich dämlich!
mit x is y fragt man nach der Klasse! Oh Mann! :cyclops:

Vielen Dank, funktioniert tadellos!
Wusste ich doch, dass der Kram trivial ist.
Und danke für die Zusatzinfos, werd ich beherzigen! :)

DeddyH 27. Apr 2014 11:55

AW: Parent Abfrage
 
Was ich noch vergessen hatte zu erwähnen: falls Du generell Images, die sich auf Scrollboxen befinden, ansprechen möchtest, kannst Du tatsächlich das is verwenden. Dann ginge das mit
Delphi-Quellcode:
if MovingImage.Parent is TScrollbox then


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:38 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