Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Objecte zwischenspeichern (https://www.delphipraxis.net/120779-objecte-zwischenspeichern.html)

HenKst 17. Sep 2008 10:48

Re: Objecte zwischenspeichern
 
:wiejetzt:
Wo werden die Objecte denn Kreiert/Platziert?
Da kannst doch auch zur Laufzeit die OnClick events und eine eindeutige Identifizierung (z.B. im tag) zuweisen.

Dann machst du im OnClick sowas wie
Delphi-Quellcode:
if (sender as TComponent).tag = PusteKuchen then begin
  add(Pustekuchen);
end;
und feddich;

Oder hab ich irgendwie total verpennt worums hier geht? :gruebel:

EWeiss 17. Sep 2008 10:51

Re: Objecte zwischenspeichern
 
Zitat:

Zitat von HenKst
:wiejetzt:
Wo werden die Objecte denn Kreiert/Platziert?
Da kannst doch auch zur Laufzeit die OnClick events und eine eindeutige Identifizierung (z.B. im tag) zuweisen.

Delphi-Quellcode:
if (sender as TControl).tag = PusteKuchen then begin
  add(Pustekuchen);
end;
Oder hab ich irgendwie total verpennt worums hier geht? :gruebel:

Wie soll ich den Tag zuweisen wenn das object noch nicht existiert
das wird doch zur Laufzeit erstellt und über die ElementType (gleichzusetzen mit Tag)
Identifiziert aber nur vom TreeView und nicht wenn ich drauf klicke.

gruss Emil

EWeiss 17. Sep 2008 10:59

Re: Objecte zwischenspeichern
 
Hallo Stefan

Delphi-Quellcode:
procedure TMainForm.JvDesignPanelSelectionChange(Sender: TObject);
bumm??? 
end;
Nein hier ...
Delphi-Quellcode:
procedure TMainForm.AddControls(ATree : TBaseVirtualTree; aCtrl: TControl; DisplayName: string);
var
  Data    : PTreeData;
  Node    : PVirtualNode;
  UIObject : TCAVEUIObject;
begin


  UIObject  := TCAVEUIObject.Create;

  Node := ATree.GetFirstSelected;
  Data := ATree.GetNodeData(Node);

  case SkinManagerInterface.ActiveScreen of
    skSplash:
    begin

    case Data.Category of
      stBackground:
      begin
        // zeigt das ausgewählte Object TImage im FInspector
        UIObject.ShowSelProperties(FInspector,aCtrl,
          ['Autosize' ,'Width', 'Height', 'Picture'], 'Background Picture');
        // zeigt Object Informationen im FInspector an
        UIObject.ShowUserObjectInfo(FInspector, FCAVEUserObject, 'Identity');
      end;
      stText:
      begin
        // zeigt das ausgewählte Object TLabel im FInspector
        UIObject.ShowSelProperties(FInspector,aCtrl,
          ['Autosize' ,'Width', 'Height',
           'Left', 'Top', 'Alignment', 'Font', 'Transparent'], 'Text');
        // zeigt Object Informationen im FInspector an
        UIObject.ShowUserObjectInfo(FInspector, FCAVEUserObject, 'Identity');
      end;
      stButton:
      begin
        // zeigt das ausgewählte Object TImage im FInspector
        UIObject.ShowSelProperties(FInspector,aCtrl,
          ['Left', 'Top', 'Width', 'Height', 'Center', 'Picture'], 'Button Picture Strip');
          Data.Image := TImage(aCtrl);
        // zeigt Object Informationen im FInspector an
        UIObject.ShowUserObjectInfo(FInspector, FCAVEUserObject, 'Identity');
      end;
     end;
     FCAVEUserObject.Name := Data.FCaption;
  end;

  end;

  // addiere Control ClassName und Name zur ComboBox
  cbObject.items.add(aCtrl.Name + ': ' + aCtrl.ClassName);

end;
und zwar dann wenn die falsche Category übergeben wird
Die kann ich aber nur auslösen bzw.. finden wenn der richtige Knoten im Tree aktiviert ist.
Ich kann den aber nicht aktivieren da ich ihn nicht kenne wenn ich auf ein object klicke.

gruss Emil

HenKst 17. Sep 2008 11:06

Re: Objecte zwischenspeichern
 
Zitat:

Zitat von EWeiss

Wie soll ich den Tag zuweisen wenn das object noch nicht existiert
das wird doch zur Laufzeit erstellt und über die ElementType (gleichzusetzen mit Tag)
Identifiziert aber nur vom TreeView und nicht wenn ich drauf klicke.

gruss Emil

Und warum nicht?
Erstellst du das Object nicht selbst?

Ich muss zugeben ich bin durch deinen Code nicht ganz durchgestiegen ;)

EWeiss 17. Sep 2008 11:12

Re: Objecte zwischenspeichern
 
Zitat:

Zitat von HenKst
Zitat:

Zitat von EWeiss

Wie soll ich den Tag zuweisen wenn das object noch nicht existiert
das wird doch zur Laufzeit erstellt und über die ElementType (gleichzusetzen mit Tag)
Identifiziert aber nur vom TreeView und nicht wenn ich drauf klicke.

gruss Emil

Und warum nicht?
Erstellst du das Object nicht selbst?

Hmm einen zusätzlichen Tag zu addieren sehe da keinen Sinn drin
da meine objecte über die Elemente identifiziert werden was macht das für einen
unterschied ob das nun über ein Array oder einen Tag geschieht.

Zitat:

Ich muss zugeben ich bin durch deinen Code nicht ganz durchgestiegen
Warum zu schlecht zu verstehen ? ;)
Ist doch dokumentiert was wo geschieht und welche aktionen ausgeführt werden.

Mein problem ist halt die schlechte Dokumentation (oder keine) von den Jedi Komponenten
Muss mir alles aus den Units saugen um zu verstehen was da abgeht
das funktioniert aber nicht immer wenn man die eigenschaften nicht kennt.

gruss Emil

HenKst 17. Sep 2008 11:26

Re: Objecte zwischenspeichern
 
Zitat:

Zitat von EWeiss
Hmm einen zusätzlichen Tag zu addieren sehe da keinen Sinn drin
da meine objecte über die Elemente identifiziert werden was macht das für einen
unterschied ob das nun über ein Array oder einen Tag geschieht.

Der Unterschied ist dass der Tag eindeutig zu einem Object gehört.
Wenn du also nach dem Kreieren(da weisst du ja hoffentlich noch um welches Element es grade geht^^) einen Tag und ein OnClick zuweist, weisst du über den Tag immer genau welches object du grade hast.
Du kannst ja auch den ElementType ins Tag schreiben ;)
Ein weiterer Vorteil vom Tag ist, dass den fast alles hat was nicht direkt von TObject abgeleitet ist. Den gibts von TComponent abwärts :)
Zitat:

Zitat von EWeiss
Warum zu schlecht zu verstehen ? ;)
Ist doch dokumentiert was wo geschieht und welche aktionen ausgeführt werden.

Mein problem ist halt die schlechte Dokumentation (oder keine) von den Jedi Komponenten
Muss mir alles aus den Units saugen um zu verstehen was da abgeht
das funktioniert aber nicht immer wenn man die eigenschaften nicht kennt.

gruss Emil

Mein problem ist halt dass ich die Jedi Komponenten garnicht kenne:)
Darum ist für mich nicht klar wo die Elemente kreiert werden.

EWeiss 17. Sep 2008 11:38

Re: Objecte zwischenspeichern
 
Zitat:

HenKst: Du kannst ja auch den ElementType ins Tag schreiben
Das wäre eine möglichkeit werd es mal versuchen
Die frage nur was mache ich wenn ich unter stBackgound( Bitmap) mehrere Dateien stehen habe
dann hab ich den Typ aber immer noch nicht das Object(Image1, Image2 usw..).

Ist also nicht so einfach.

gruss Emil

HenKst 17. Sep 2008 11:56

Re: Objecte zwischenspeichern
 
Auf die schnelle fällt mir da ein record ein den du in den Tag schreibst.

Delphi-Quellcode:
TEnumTypeInfo = record
  TypeInfo: PTypeInfo;
  Index: Integer;
end;
Im TypeInfo steht die TypeInfo(wow...) und im Index der index des jeweiligen Elements.
Könntest dir dann nen globalen Zähler machen der immer incrementiert wird wenn ein Image kreiert wird.
Ich behaupte das wäre immernoch praktischer als ein array dessen indizes du nicht weisst^^

EWeiss 17. Sep 2008 12:18

Re: Objecte zwischenspeichern
 
Zitat:

Zitat von HenKst
Auf die schnelle fällt mir da ein record ein den du in den Tag schreibst.

Delphi-Quellcode:
TEnumTypeInfo = record
  TypeInfo: PTypeInfo;
  Index: Integer;
end;
Im TypeInfo steht die TypeInfo(wow...) und im Index der index des jeweiligen Elements.
Könntest dir dann nen globalen Zähler machen der immer incrementiert wird wenn ein Image kreiert wird.
Ich behaupte das wäre immernoch praktischer als ein array dessen indizes du nicht weisst^^

Hmmm ;)
Gut gemeinter Ratschlag was soll ich damit machen?
Bekomme dann nur das Kind übergeben was mir aber nichts bringt.

Delphi-Quellcode:
type
  TTypeKind = (tkUnknown, tkInteger, tkChar, tkEnumeration, tkFloat,
    tkString, tkSet, tkClass, tkMethod, tkWChar, tkLString, tkWString,
    tkVariant, tkArray, tkRecord, tkInterface, tkInt64, tkDynArray);
Trotzdem Danke..

Gruss Emil

nahpets 17. Sep 2008 12:22

Re: Objecte zwischenspeichern
 
Hallo Emil,

einen hab ich noch :wink:

Es besteht wohl ein Konflikt zwischen

Delphi-Quellcode:
procedure TMainForm.AddControls(ATree : TBaseVirtualTree; aCtrl: TControl; DisplayName: string);
und
Delphi-Quellcode:
Node := ATree.GetFirstSelected;
Data := ATree.GetNodeData(Node);
aCtrl muss nicht zwingend identisch sein mit dem selektierten Node.

Also ein Versuch:

Den Baum und seine Knoten von oben her durcharbeiten und suchen, welcher Node vom gleichen Typ wie aCtrl ist. Diesem Node den Fokus geben, dann sollte es gehen.

Hierüber könnte es doch möglich sein, die Objekte zu vergleichen, wenn eine IF-Kaskade mit IS und AS nicht ausreicht:
Delphi-Quellcode:
{ Die Prozedur ermittelt Basis-Laufzeit-Informationen zum übergebenen Objekt  }
{ und gibt die Informationen in einer Stringliste zurück.                     }
procedure GetBaseClassInfo(AClass: TObject);
var
  ClassTypeInfo : PTypeInfo;
  ClassTypeData : PTypeData;
  EnumName     : String;
begin
  ClassTypeInfo := AClass.ClassInfo;
  ClassTypeData := GetTypeData(ClassTypeInfo);
  with sl Do Begin
    Add(Format('Class Name:    %s ', [ClassTypeInfo.Name]));
    EnumName := GetEnumName(TypeInfo(TTypeKind), Integer(ClassTypeInfo.Kind));
    Add(Format('Kind:          %s ', [EnumName]));
    Add(Format('Size:          %d ', [AClass.InstanceSize]));
    Add(Format('Defined in:    %s.pas ', [ClassTypeData.UnitName]));
    Add(Format('Num Properties: %d ',[ClassTypeData.PropCount]));
  End;
end;
Wenn hier der Typ festgestellt werden kann, müsste (über ein entsprechendes Cast?) ja auch der Name des Objektes zu finden sein, um das dann im Tree zu selektieren.

Wenn nicht, dann weiß ich auch nicht weiter :cry:

Stephan


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:54 Uhr.
Seite 2 von 4     12 34      

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