AGB  ·  Datenschutz  ·  Impressum  







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

Objecte zwischenspeichern

Ein Thema von EWeiss · begonnen am 16. Sep 2008 · letzter Beitrag vom 22. Sep 2008
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
EWeiss
(Gast)

n/a Beiträge
 
#1

Objecte zwischenspeichern

  Alt 16. Sep 2008, 15:51
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
  Mit Zitat antworten Zitat
HenKst

Registriert seit: 7. Jul 2008
113 Beiträge
 
#2

Re: Objecte zwischenspeichern

  Alt 16. Sep 2008, 16:04
Ich hab ja jetzt nicht genau verstanden was du meinst, aber guck dir mal TTreenode.Data an
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

Re: Objecte zwischenspeichern

  Alt 16. Sep 2008, 16:20
Zitat von HenKst:
Ich hab ja jetzt nicht genau verstanden was du meinst, aber guck dir mal TTreenode.Data an
Es geht nicht um das TreeView sondern um die Objecte welche ich auf mein DesignerPanel lege.
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
  Mit Zitat antworten Zitat
HenKst

Registriert seit: 7. Jul 2008
113 Beiträge
 
#4

Re: Objecte zwischenspeichern

  Alt 16. Sep 2008, 16:32
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.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

Re: Objecte zwischenspeichern

  Alt 16. Sep 2008, 16:49
Zitat von HenKst:
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.
Der ist mir nicht bekannt weil das object zur laufzeit erstellt wird.

Delphi-Quellcode:
procedure TMainForm.JvDesignPanelSelectionChange(Sender: TObject);
snip..

end;
Ich lege 3 objecte drauf .. 2 TImages und ein TLabel
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
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#6

Re: Objecte zwischenspeichern

  Alt 16. Sep 2008, 18:24
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
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

Re: Objecte zwischenspeichern

  Alt 16. Sep 2008, 19:00
Zitat von nahpets:
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
HI Stefan
Werd mal schaun hab die Unit ja schon eingebunden
Glaube aber nicht das mir das bei meinen Problem hilft...

gruss Emil
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#8

Re: Objecte zwischenspeichern

  Alt 17. Sep 2008, 10:11
Hallo Emil,

könnte Dir das helfen?

Delphi-Quellcode:
{ 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;
PPropInfo wird in TypInfo definiert.

Über die TypInfo sollte es Dir gelingen, eine vollständige Dokumentation Deiner Klassen/Objekte zu erstellen. Es ist allerdings etwas kryptisch.

GetPropInfos(AClass.ClassInfo, PropList); liefert Dir eine Liste aller Properties, hier kannst Du z. B. den Typ abfragen

PropList[i]^.PropType^.Kind über

GetPropValue(AClass,PropList[i]^.Name,True) bekommst Du den der Eigenschaft zugewiesenen Wert, ohne die Klasse/das Objekt zu kennen.

Schau doch einfach mal da http://www.montefiore.ulg.ac.be/~lat...unitsse82.html, ob Du was brauchbares findest, eventuell hilft Dir auch das http://www.swissdelphicenter.ch/torr...de.php?id=1084 weiter.

Stephan
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

Re: Objecte zwischenspeichern

  Alt 17. Sep 2008, 11:02
Danke dir das sind auf jedenfall verwertbare informationen

Ich versuche nochmal mein problem zu schildern.
Ich hab festgelegte Elemente das wären
Delphi-Quellcode:
TCAVEElementType = (stBackground, stText, stButton, stNone);
TCAVEElementTotals: array[TCAVEElementType] of Integer;
Beim ersten start der Anwendung geht erst mal nix ohne das VST(TreeView)

Beim klick auf den Eintrag Background wird diese Funktion aufgrufen
Delphi-Quellcode:
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;
Der Toplevel des gewählten Eintrag wird nun gesucht und das Element zugewiesen
Delphi-Quellcode:
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;
ScreensObj ist die Stringlist in der die Knoten beim start zugewiesen wurden
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
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:
TStringList ?
Classe ?
Oder wie sonst ..am besten mit allen geänderten eigenschaften damit diese auch gleich
wieder im Inspector aktualisiert werden.

gruss Emil
Miniaturansicht angehängter Grafiken
test_511.jpg  
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#10

Re: Objecte zwischenspeichern

  Alt 17. Sep 2008, 11:29
Hallo Emil,

ich versteh' das nicht:

Heißt das, Du hast hier Dein Problem?

Delphi-Quellcode:
procedure TMainForm.JvDesignPanelSelectionChange(Sender: TObject);
bumm???
end;
Dann müsstest Du für meine Begriffe mit Hilfe der TypInfo herausbekommen können, was denn da bitte jetzt genau in Sender steckt.

Hiermit solltest Du z. B. herausbekommen, in welcher Unit Deine Klasse definiert ist:
Delphi-Quellcode:
{ 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;
Das sollte Dir eine Liste der Vorfahren Deiner Klasse bringen:
Delphi-Quellcode:
{ 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;
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.

Wenn Du nun nur TImage und TLabel hast, müsste doch ein

If HasProperty(Sender, 'Picture') Then anstelle von "bumm???" reichen, um festzustellen, ob es ein TImage ist oder nicht? Oder bin ich hier momentan auf dem falschen (Rhein)-Dampfer.

Stephan
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


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 05:17 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