Delphi-PRAXiS
Seite 3 von 4     123 4      

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)

EWeiss 17. Sep 2008 12:30

Re: Objecte zwischenspeichern
 
Danke schön werd es mal testen und bescheid geben ob ein Erfolg zu verzeichnen ist.

gruss Emil

EWeiss 17. Sep 2008 17:27

Re: Objecte zwischenspeichern
 
Hab jetzt eine lösung gefunden na ja nicht das aller beste aber es funktioniert
Dank an HenKst hab es mit dem Tag und unter Hilfe von Stephan doch noch geschaft.

Delphi-Quellcode:
function TCAVESkinManager.GetSelectedCategory(ObjectList: TStringList; TreeView: TBaseVirtualTree; Obj: TObject): TCAVEElementType;
var
  Data       : PTreeData;   // Zeiger auf die Structur
  SearchData : PTreeData;   // Zeiger auf die Structur
  Tag        : Integer;     // wird addiert zum Object wenn erstellt

begin
  // Daten zurücksetzen
  Data := nil;

  // raus hier wenn kein Tag im Object vorhanden
  if TControl(Obj).tag = 0 then
  begin
    Result := stNone;
    exit;
  end;

  New(SearchData);

  Tag := TControl(Obj).tag;
  // Index out of bound von ObjectList verhindern
  dec(Tag);

  begin
    // Caption übergeben ermittelt über ObjectList.Index
    // verglichen mit dem im Obj übergebenen Tag
    SearchData^.FCaption := ObjectList.strings[Tag];
    FFoundNode := nil;
    // Callback IterateSubTree aufrufen
    TreeView.IterateSubTree (nil, FSkinTreeCallBack, pointer(SearchData));
    // Eintrag gefunden .. CategoryNode zuweisen
    if Assigned(FFoundNode) then
    begin
      // Node an die class TCAVESkinManager übergeben
      CategoryNode := FFoundNode;
      // Structur Daten aktualisieren
      Data := TreeView.GetNodeData(CategoryNode);
    end;
  end;

  Result := Data.Category;

end;
Um nicht einen neuen Thread zu erstellen eine Frage hinterher ;)
Wie kann ich jetzt übergreifend für alle Obj ein MouseEvent übergeben
Das existiert ja nicht bei der erstellung zur Laufzeit.

übergreifend (für alle die gleiche)
Oder sollte man das aufteilen ?

gruss Emil

nahpets 18. Sep 2008 09:57

Re: Objecte zwischenspeichern
 
Hallo Emil,

hat Dein Objekt ein OnMouseDown?

Dann beim Erstellen des Objektes diesem Attribut eine Methode zuweisen. Die musst Du irgendwo implementieren, wievielen Objekten Du sie letztlich zuweist, ist dabei vollkommen schnuppe.

Sowas in der Art könnte Dir helfen:

Delphi-Quellcode:
type
  TfmMain = class(TForm)
...
    procedure miBerichteClick(Sender: TObject);
...
  private
...

implementation
...

procedure TfmMain.miBerichteClick(Sender : TObject);
Begin
  If Sender Is tMenuItem Then With Sender As tMenuItem Do Begin
    ShowMessage(Name + ' ' + Caption + ' ' + IntToStr(Tag));
  End;
End;

...

  Obj.Create(wieauchimmer);
...
  // Ereignisroutine zuweisen
  Obj.OnMouseDown := fmMain.miBerichteClick;
...
Stephan

EWeiss 18. Sep 2008 11:18

Re: Objecte zwischenspeichern
 
Zitat:

Zitat von nahpets
Hallo Emil,

hat Dein Objekt ein OnMouseDown?

Dann beim Erstellen des Objektes diesem Attribut eine Methode zuweisen. Die musst Du irgendwo implementieren, wievielen Objekten Du sie letztlich zuweist, ist dabei vollkommen schnuppe.

Sowas in der Art könnte Dir helfen:

Delphi-Quellcode:
type
  TfmMain = class(TForm)
...
    procedure miBerichteClick(Sender: TObject);
...
  private
...

implementation
...

procedure TfmMain.miBerichteClick(Sender : TObject);
Begin
  If Sender Is tMenuItem Then With Sender As tMenuItem Do Begin
    ShowMessage(Name + ' ' + Caption + ' ' + IntToStr(Tag));
  End;
End;

...

  Obj.Create(wieauchimmer);
...
  // Ereignisroutine zuweisen
  Obj.OnMouseDown := fmMain.miBerichteClick;
...
Stephan

Super wie du mir bei meinen problemen hilfst ;)
Denk das kann ich genause für Move und Down verwenden lediglich das Click Event auf down und move verändern

gruss Emil

HenKst 18. Sep 2008 11:47

Re: Objecte zwischenspeichern
 
Zitat:

Zitat von EWeiss
Denk das kann ich genause für Move und Down verwenden lediglich das Click Event auf down und move verändern

Versteh ich jetz nich.
Das OnClick kannst du doch genauso zuweisen.
Haben TPicture und TLabel, soweit ich mich erinnere, beide ;)

Zitat:

Dank an HenKst
biddeschön :D

EWeiss 18. Sep 2008 12:02

Re: Objecte zwischenspeichern
 
Zitat:

Zitat von HenKst
Zitat:

Zitat von EWeiss
Denk das kann ich genause für Move und Down verwenden lediglich das Click Event auf down und move verändern

Versteh ich jetz nich.
Das OnClick kannst du doch genauso zuweisen.
Haben TPicture und TLabel, soweit ich mich erinnere, beide ;)

Zitat:

Zitat von "EWeiss
Dank an HenKst

biddeschön :D

ich meine so ;)
Delphi-Quellcode:
Obj.OnMouseDown := fmMain.miBerichteMouseDown;
Obj.OnMouseMove := fmMain.miBerichteMouseMove;
Obj.OnMouseUp := fmMain.miBerichteMouseUp;

procedure miBerichteMouseDown(Sender: TObject.. bla bla); //was halt noch zu dem Event MouseDown gehört
usw...

haben uns da wohl falsch verstanden ..

Gruss Emil

nahpets 18. Sep 2008 12:09

Re: Objecte zwischenspeichern
 
Hallo Emil,

nä, lieber nicht.
So würde beim Drücken der Maustaste das Ereignis ausgelöst, beim Festhalten und beim Loslassen.
Okay, aller Guten Dinge sind drei, aber hier ist das wohl übertrieben. Du musst schon entscheiden, wann die Anwendung des Ereignisses vom Programmablauf her sinnvoll ist.

Klickst Du eine Komponente an, um sie zu verschieben, muss das Ereignis eventuell noch nicht ausgelöst werden, sondern erst, wenn das Objekt an der neuen Stelle ist, weil Du z. B. seine neue Position wissen möchtest.
Wenn es sich um die TLabels und TImages handelt, dann ist eventuell auch die Benutzung von onDoubleClick sinnvoller, kommt halt auf die Aufgabe an.

Stephan

EWeiss 18. Sep 2008 12:31

Re: Objecte zwischenspeichern
 
Zitat:

Zitat von nahpets
Hallo Emil,

nä, lieber nicht.
So würde beim Drücken der Maustaste das Ereignis ausgelöst, beim Festhalten und beim Loslassen.
Okay, aller Guten Dinge sind drei, aber hier ist das wohl übertrieben. Du musst schon entscheiden, wann die Anwendung des Ereignisses vom Programmablauf her sinnvoll ist.

Klickst Du eine Komponente an, um sie zu verschieben, muss das Ereignis eventuell noch nicht ausgelöst werden, sondern erst, wenn das Objekt an der neuen Stelle ist, weil Du z. B. seine neue Position wissen möchtest.
Wenn es sich um die TLabels und TImages handelt, dann ist eventuell auch die Benutzung von onDoubleClick sinnvoller, kommt halt auf die Aufgabe an.

Stephan

Nein, nein
Ich benötige diese ereignisse ;)
Jedoch nicht im Design mode wenn du ein object verschiebst oder änderst.
Nur wenn Preview eingeschaltet ist werden diese Events ausgelößt.

Ich prüfe also vorher im MouseMove oder anderen Event ob
Delphi-Quellcode:
JvDesignPanel.Active := Active1.Checked;
Ich brauche die teile da ich ein ImageStrip einlade das nachher mit den Events
geblittet wird.
Ich hoffe das es funktioniert :)

gruss Emil

EWeiss 19. Sep 2008 18:37

Re: Objecte zwischenspeichern
 
@Stephan

habe das mal getestet beomme aber das von dir benannte event nicht
weder onMouseMove ,Down noch ein anderes.

kann es also aObj nicht zuweisen.
Delphi-Quellcode:
procedure TCAVEUIObject.ShowSelProperties(Inspector: TJvInspector;
  aObj: TObject; Props: array of string; NodeText: string);
var
  i      : integer;
  Category: TJvInspectorCustomCategoryItem;

begin
  Inspector.Root.Clear;

  Category := TJvInspectorCustomCategoryItem.Create(Inspector.Root, nil);
  Category.DisplayName := NodeText;
  Inspector.Root.SortKind := iskNone;

  for i:=Low(Props) to High(Props) do
    TJvInspectorPropData.New(Category, aObj, GetPropInfo(aObj, Props[i]));

  if aObj.classname = 'TImage' then
    tmpImage := TImage(aObj);

  Category.Expanded := True;
end;
gruss Emil

HenKst 22. Sep 2008 12:24

Re: Objecte zwischenspeichern
 
Mal zum Verständis.

Du Rufst im OnMouseDown Event TCAVEUIObject.ShowSelProperties(bla, sender, bla,bla) auf?
Aber im Event kommst du garnicht erst an?

Parent und alles richtig gesetzt? (Das is meistens bei mir das problem wenn objecte nicht da sind^^)

Ich habs grade getestet und hab(nachdem ich dann endlich auch den parent richtig gesetzt hatte :D ) wunderbar ein zur laufzeit erzeugtes TImage übers Onclick wieder gefreet, indem ich den sender im OnMouseDown einer free prozedur übegeben habe.

Wüsste also nicht wieso das bei dir nicht klappen sollte.
Es sei denn du hast halt den Parent nicht gesetzt^^
Vielleicht ist dir das ja nicht aufgefallen.
TImage und TLabel sind ja beide nicht zu sehen solange nichts drin ist :D


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:32 Uhr.
Seite 3 von 4     123 4      

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