![]() |
Objecte zwischenspeichern
Hab ein problem mit dem auffinden meiner auf ein DesignerPanel gelegten Objecte
Wie kann man die am besten zwischenspeichern damit man sie wiederfindet wenn man drauf klickt? irgendwie stoße ich da an meine grenzen .. Finden kann ich sie über meine Node im TreeView aber wenn ich ein anderes anklicke auf den Panel ändert sich der eintrag im TreeView ja nicht Addiere ich die zu einer Stringlist bringt das auch nichts da ich nur den Namen vom eintrag im TreeView der Liste hinzu füge um das Object zu identifizieren. Wenn ich auf ein Object klicke könnte ich zwar den gespeicherten namen im TreeView suchen dazu muss ich aber in der Funktion die Node initialisieren und die liegt ja bekanntlich noch auf dem alten eintrag. Drehe mich da irgendwie im Kreis. gruss Emil |
Re: Objecte zwischenspeichern
Ich hab ja jetzt nicht genau verstanden was du meinst, aber guck dir mal TTreenode.Data an :)
|
Re: Objecte zwischenspeichern
Zitat:
Diese muss ich wenn ein klick drauf erfolgt identifizieren können. Mein Problem ist mit fällt nicht ein mit was. TreeView fällt flach da der eintrag sich nicht von alleine neu selektiert wenn ich nicht weis welches Object angeklickt wurde. gruss EMil |
Re: Objecte zwischenspeichern
Was legst du denn für Objecte drauf?
Wenn die ein Onclick haben sollte der meist auch einen Sender haben. Da steht der Pointer aufs Object eindeutig drin. |
Re: Objecte zwischenspeichern
Zitat:
Delphi-Quellcode:
Ich lege 3 objecte drauf .. 2 TImages und ein TLabel
procedure TMainForm.JvDesignPanelSelectionChange(Sender: TObject);
snip.. end; Wird diese funktion aufgerufen und das object nicht hundertpro identifiziert hat dies zur folge das falsche werte des objects die nicht enthalten sind in den Inspector addiert werden. Dann kommt es zur Fehlermeldung. Beispiel TLabel hat kein Bitmap Habe ich also zuletzt ein Image addiert dann übergebe ich dessen eigenschaften auf das Label wenn ich das Object nicht richtig identifiziert habe. Das führt unweigerlich zum crash. gruss Emil |
Re: Objecte zwischenspeichern
Hallo,
schau Dir mal die TypInfo.pas aus \Delphi\Source\Rtl\Common an, eventuell enthält die Funktionen, mit denen Du den Type ermitteln kannst oder zumindest prüfen kannst, ob es ein bestimmtes Attribut oder eine bestimmte Methode gibt. Stephan |
Re: Objecte zwischenspeichern
Zitat:
Werd mal schaun hab die Unit ja schon eingebunden Glaube aber nicht das mir das bei meinen Problem hilft... gruss Emil |
Re: Objecte zwischenspeichern
Hallo Emil,
könnte Dir das helfen?
Delphi-Quellcode:
PPropInfo wird in TypInfo definiert.
{ Die Funktion prüft, ob die übergebene Klasse ein Attribut mit dem angege- }
{ benen Namen hat. } Function HasProperty(AClass : TObject; APropertyName : String) : Boolean; Var MyPropInfo : PPropInfo; Begin MyPropInfo := GetPropInfo(AClass.ClassInfo, APropertyName); Result := MyPropInfo <> NIL; End; Über die TypInfo sollte es Dir gelingen, eine vollständige Dokumentation Deiner Klassen/Objekte zu erstellen. Es ist allerdings etwas kryptisch.
Delphi-Quellcode:
liefert Dir eine Liste aller Properties, hier kannst Du z. B. den Typ abfragen
GetPropInfos(AClass.ClassInfo, PropList);
Delphi-Quellcode:
über
PropList[i]^.PropType^.Kind
Delphi-Quellcode:
bekommst Du den der Eigenschaft zugewiesenen Wert, ohne die Klasse/das Objekt zu kennen.
GetPropValue(AClass,PropList[i]^.Name,True)
Schau doch einfach mal da ![]() ![]() Stephan |
Re: Objecte zwischenspeichern
Liste der Anhänge anzeigen (Anzahl: 1)
Danke dir das sind auf jedenfall verwertbare informationen
Ich versuche nochmal mein problem zu schildern. Ich hab festgelegte Elemente das wären
Delphi-Quellcode:
Beim ersten start der Anwendung geht erst mal nix ohne das VST(TreeView)
TCAVEElementType = (stBackground, stText, stButton, stNone);
TCAVEElementTotals: array[TCAVEElementType] of Integer; Beim klick auf den Eintrag Background wird diese Funktion aufgrufen
Delphi-Quellcode:
Der Toplevel des gewählten Eintrag wird nun gesucht und das Element zugewiesen
procedure TMainForm.PaletteStdButtonClick(Sender: TObject);
var Data : PTreeData; Node : PVirtualNode; const cClasses: array[0..1] of string = ('TImage', 'TLabel'); begin StickyClass := (GetKeyState(VK_SHIFT) < 0); // Selectierte Node Initialisieren Node := FSkinTree.GetFirstSelected; Data := FSkinTree.GetNodeData(Node); // Hole die Data.Category vom Top Level der ausgewählten Node Data.Category := SkinManagerInterface.GetSelectedCategory(FScreensObj, FSkinTree); // Objecte angzeigen abhängig vom Index des cClasses Array case Data.Category of stBackground: // TImage DesignClass := cClasses[0]; stText: // TLabel DesignClass := cClasses[1]; stButton: // TImage DesignClass := cClasses[0]; end; end;
Delphi-Quellcode:
ScreensObj ist die Stringlist in der die Knoten beim start zugewiesen wurden
function TCAVESkinManager.GetSelectedCategory(ScreensObj: TStringList; TreeView: TBaseVirtualTree): TCAVEElementType;
var Node: PVirtualNode; Data: PTreeData; IntI: Integer; begin Node := TreeView.GetFirstSelected; // Bestimme die Kategorie für den ausgewählten Knoten while (Node <> nil) and (TreeView.GetNodeLevel(Node) > 1) do Node := Node.Parent; Data := TreeView.GetNodeData(Node); if Data <> nil then for IntI := 0 to ScreensObj.Count - 1 do if ScreensObj.Strings[IntI] = Data.FCaption then Data.Category := TCAVEElementType(IntI); Result := Data.Category; end; abhängig vom Elementtyp um diesen über den VST zu Identifizieren. Klicke ich nun in das Panel wird das Object abhängig vom ELementTyp auf dem abgelegt. In dem Fall TImage. Wenn nun alle Objecte abgelegt und ich auf irgendeins davon klicke muss ich vergleichen können welches das ist und zwar abhängig vom ElementType da es sonst unweigerlich zum crash kommt. Das geht aber in dem Fall nicht über das TreeView. Und das ist mein problem hab keine Idee wie oder wo ich da abfangen soll :wall: welches object das ist um den ElementTyp korrekt zuweisen zu können. Ja ist schwer zu erklären ;) Wie kann ich also die aofgesetzen objecte sinnvoll zwischenspeichern damit ich sie wieder finde ? Zitat:
wieder im Inspector aktualisiert werden. gruss Emil |
Re: Objecte zwischenspeichern
Hallo Emil,
ich versteh' das nicht: Heißt das, Du hast hier Dein Problem?
Delphi-Quellcode:
Dann müsstest Du für meine Begriffe mit Hilfe der TypInfo herausbekommen können, was denn da bitte jetzt genau in Sender steckt.
procedure TMainForm.JvDesignPanelSelectionChange(Sender: TObject);
bumm??? end; Hiermit solltest Du z. B. herausbekommen, in welcher Unit Deine Klasse definiert ist:
Delphi-Quellcode:
Das sollte Dir eine Liste der Vorfahren Deiner Klasse bringen:
{ Die Funktion liefert den Namen der Unit, in der die übergebene Klasse defi- }
{ niert wurde. } function GetUnitName(AClass : TObject) : String; var ClassTypeInfo : PTypeInfo; ClassTypeData : PTypeData; begin ClassTypeInfo := AClass.ClassInfo; ClassTypeData := GetTypeData(ClassTypeInfo); Result := ClassTypeData.UnitName; end;
Delphi-Quellcode:
Es müsste doch damit und ggfls. weiteren Funktionen möglich sein, herauszubekommen, was für ein Objekt da jetzt ankommt und zu entscheiden, das nehme ich oder das nehme ich nicht an oder das behandle ich so oder eben anders oder auch garnicht.
{ Die Prozedur ermittelt die Vererbungsstruktur des übergebenen Objektes und }
{ gibt die Struktur in der Stringliste zurück. } procedure GetClassAncestry(AClass: TObject); var AncestorClass : TClass; begin AncestorClass := AClass.ClassParent; { Iteriert durch die Parentklassen, beginnend mit dem übergebenen Objekt, } { bis kein Vorfahre mehr vorhanden ist. } GlobaleStringListe.Add('Class Ancestry'); while AncestorClass <> nil do begin GlobaleStringListe.Add(AncestorClass.ClassName)); AncestorClass := AncestorClass.ClassParent; end; end; Wenn Du nun nur TImage und TLabel hast, müsste doch ein
Delphi-Quellcode:
anstelle von "bumm???" reichen, um festzustellen, ob es ein TImage ist oder nicht? Oder bin ich hier momentan auf dem falschen (Rhein)-Dampfer.
If HasProperty(Sender, 'Picture') Then
Stephan |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:58 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 by Thomas Breitkreuz