![]() |
Problem mit Object Inspector
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo
Habe ein problem beim addieren von meinen Controls. Wenn ich ein Image oder label auf die Form lege wie komme ich dann an das aufgesetzte control ? So sieht es bisher aus. Wenn ich auf den Button für den Label oder das Image klicke springe ich in diese Funktion
Delphi-Quellcode:
Klicke ich nun auf das Designer Window dann hole ich mir die Class über
procedure TMainForm.PaletteStdButtonClick(Sender: TObject);
const cClasses: array[0..2] of string = ( '', 'TImage', 'TLabel'); begin StickyClass := (GetKeyState(VK_SHIFT) < 0); DesignClass := cClasses[TControl(Sender).Tag]; end;
Delphi-Quellcode:
Ist DesignClass mehr als nichts versuche ich das Control dem Object inspector hinzu zu fügen
procedure TMainForm.JvDesignPanelGetAddClass(Sender: TObject; var ioClass: String);
begin ioClass := DesignClass; if DesignClass <> '' then AddControls(TControl(Sender), DesignClass); if not StickyClass then begin DesignClass := ''; end; end;
Delphi-Quellcode:
AddControls(TControl(Sender), DesignClass);
Delphi-Quellcode:
Das problem ist nun das er mir nicht die eigenschaften vom Image1 bzw.. Label1 addiert
procedure TMainForm.AddControls(NewObject: TControl; DisplayName: string);
var InspCat: TJvInspectorCustomCategoryItem; begin InspCat := TJvInspectorCustomCategoryItem.Create(JvInspector1.Root, nil); InspCat.DisplayName := DisplayName; InspCat.SortKind := iskNone; AddCtrl(InspCat, NewObject); InspCat.Expanded := True; end; procedure TMainForm.AddCtrl(const Parent: TJvCustomInspectorItem; const Ctrl: TControl); var InspCat: TJvInspectorCustomCategoryItem; begin InspCat := TJvInspectorCustomCategoryItem.Create(Parent, nil); InspCat.DisplayName := Ctrl.Name + ': ' + Ctrl.ClassName; TJvInspectorPropData.New(InspCat, Ctrl); end; sondern logischerweise(weil der Sender) das TJvDesignSurface ... Habe im moment keine idee wo ich die beiden Controls zum TreeView bzw.. den Object Inspector hinzufügen soll. Wäre schön wenn jemand helfen könnte. Im Anhang ein Bild. (ala Widget von David) gruss Emil |
Re: Problem mit Object Inspector
Also in meinem Editor meiner
![]() Zuerst hab ich mal eine Liste, in der alle Komponenten sind, die ich für die Widget-Engine zur Verfügung stelle. Das Grundgerüst sieht folgendermaßen aus:
Delphi-Quellcode:
So, jetzt füge ich erst alle verfügbaren Klassen in die Liste hinzu. Beim Label schaut das z.B. so aus:
type
TwgComponentClass = class of TwgComponent; // meine Grundkomponente PwgClassListEntry = ^TwgClassListEntry; TwgClassListEntry = record ClassName : string; ClassType : TwgComponentClass; InPalette : boolean; PaletteEntry: string; end; TwgClassList = class(TObject) private FList : TList; protected function GetCount: integer; function FindClassByName(Name: string): TwgComponentClass; function FindClassByIndex(index: integer): TwgComponentClass; function GetItem(index: integer): PwgClassListEntry; function IndexOf(ClassName: string): integer; function IndexOfClass(aClass: TwgComponentClass): integer; procedure Clear; public constructor Create; destructor Destroy; override; procedure AddClass(ClassName: string; aClass: TwgComponentClass; InPalette: boolean; PaletteEntry: string); function HasClass(ClassName: string): boolean; function GetClassName(aClass: TwgComponentClass): string; property Items[index: integer] : PwgClassListEntry read GetItem; property GetClass[Name: string]: TwgComponentClass read FindClassByName; default; property Count : integer read GetCount; end; var // eine globale Variable, die im initialization-Teil der Unit erstellt wird wgClassList: TwgClassList
Delphi-Quellcode:
Im Editor gibt es dann eine einfache Methode, eine neue Klasse zu erstellen:
wgClassList.AddClass(TwgLabel.ClassName, TwgLabel, True, 'Standard');
Delphi-Quellcode:
Ach noch was: Ich verwende nicht TControl als Basis, sondern eine eigene Basisklasse. Daher ist bei mir TwgComponent bei dir TControl
function TWidgetEditor.DoAddClass(ClassName: string; var NewObject: TwgComponent): boolean;
var CompClass: TwgComponentClass; begin CompClass := wgClassList.GetClass[ClassName]; if CompClass = nil then result := False else begin NewObject := CompClass.Create; result := True; // Und nun die Klasse bei dir im JvInspector anzeigen AddControls(result, 'Irgendwas'); end; end; Hoffe das Hilft dir etwas. |
Re: Problem mit Object Inspector
Danke für die Infos ;)
Mein problem ist das addieren zum TreeView sowie zum Object Inpector. Meine damit das ich nicht an die Eigenschaften herankomme Hast du diese vorher für deinen Label und Image selber festgelegt? Steige noch nicht so richtig hinter die Materie. Copy Paste bringt nichts da ich im moment noch nicht erkennen kann wie die eigenschaften addiert werden Aber helfen tut die Info auf jeden fall gruss Emil |
Re: Problem mit Object Inspector
Ist das Problem, dass du im Objekt-Inspektor nichts siehst oder dass die falsche Komponente hinzugefügt wird? Ich kapier gerade nicht, was jetzt genau das Problem ist. :gruebel:
|
Re: Problem mit Object Inspector
Zitat:
Addierst du doch in der Combo den ClassNamen wgLabel1: TwgLabel anschließend im TreeView wgLabel1 und füllst dann den Inspector mit den eigenschaften von Label aligment , Caption usw.. Das ist mein problem weis nicht wie ich an die Eigenschaften komme bzw.. ob du sie vorher selber festgelegt hast. EDIT: Hast du ein ganz einfaches Sample ? Wo ich sehen kann wie die technic funktioniert ? bsp: Für einen label ? gruss Emil |
Re: Problem mit Object Inspector
Also der JvInspector ist schon etwas komplizierter, um ihn mal kurz zu erklären. Der kann sowohl mit RTTI und ohne RTTI benutzt werden. Hier mal ein einfaches Beispiel, um an ein Label in den Inspector zu bekommen (mit RTTI):
Delphi-Quellcode:
type
TForm1 = class(TForm) Label1: TLabel; // das Label JvInspector1: TJvInspector; // der Inspektor procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } procedure ShowObject(aObj: TObject); end; implementation procedure TForm1.FormCreate(Sender: TObject); begin ShowObject(Label1); end; procedure TForm1.ShowObject(aObj: TObject); begin JvInspector1.Root.Clear; TJvInspectorPropData.New(JvInspector1.Root, aObj); end; |
Re: Problem mit Object Inspector
Das heißt es gehen nur Variablen die in dem Object schon enthalten sind ?
Verstehe ich nicht.. Ich möchte ja eigentlich nur werte addieren die für mich von bedeutung sind Sehe schon das dauert länger als erwartet muss mich da erst einarbeiten. ;) Danke. gruss Emil |
Re: Problem mit Object Inspector
Der JvInspector arbeitet mit RTTI. Alle published-Properties von Objekten, die von TPersistent abgeleitet sind, haben RTTI aktiviert. Diese RTTI liest der JvInspector aus und stellt diese dann dar.
Sagen wir mal, du hast eine Klasse:
Delphi-Quellcode:
Wenn du jetzt diese Klassen in JvInspector hineinlädst, wirst du nur die Eigenschaft "Blub" sehen, "Hm" siehst du nicht, da Hm nicht published ist und somit keine RTTI hat.
type
TMyClass = class(TPersistent) private FBlub : string; FHm : integer; public property Hm: integer read FHm write FHm; published property Blub: string read FBlub write FBlub; end; Aber du kannst die RTTI noch hinzufügen lassen, wenn du eine neue Klasse davon ableitest und die property "Hm" in den Published-Bereich "verschiebst"
Delphi-Quellcode:
Wenn du jetzt die neue Klassen in JvInspector hineinlädst, wirst du beide Eingenschaften sehen.
type
TMyObj = class(TMyClass) published property Hm; end; Wenn du jetzt von TLabel nur bestimmte Sachen in den Inspektor laden willst, hab ich auch noch schnell nen Quelltext für dich. Diesen musst du einfach in das obige Beispiel von mir hineinkopieren.
Delphi-Quellcode:
uses
TypInfo; procedure TForm1.ShowObject(aObj: TObject); begin JvInspector1.Root.Clear; TJvInspectorPropData.New(JvInspector1.Root, aObj, GetPropInfo(aObj, 'Left')); TJvInspectorPropData.New(JvInspector1.Root, aObj, GetPropInfo(aObj, 'Top')); TJvInspectorPropData.New(JvInspector1.Root, aObj, GetPropInfo(aObj, 'Align')); end; |
Re: Problem mit Object Inspector
Ja das hilft mir schon mal enorm ;)
Pack mir das mal in ne Form und Teste das ergebnis da versteht man schneller und sieht vor allem was passiert. gruss Emil |
Re: Problem mit Object Inspector
Liste der Anhänge anzeigen (Anzahl: 1)
Hier mal meine letzten Beiträge zusammengefasst.
|
Re: Problem mit Object Inspector
Zitat:
EDIT: Das ist erklärlich aber mein problem bleibt bestehen Ich komme nicht an das Object (Label) was ich auf die Form gepackt habe. Da der letzte Sender das JvDesignSurface ist. Kann es sein das ich mich nicht exakt genug ausdrücke ? Wenn ich auf mein Label klicke rechts oben der Button wie bei (Widget) Dann übergebe ich die Classe abhängig vom index der im Tag deklariert ist.. in dem fall die 2
Delphi-Quellcode:
Also das Obj ist nun ein TLabel ist auch richtig bis hierher..
DesignClass := cClasses[TControl(Sender).Tag];
Das DesignPanel verwendet das Event 'JvDesignPanelGetAddClass'
Delphi-Quellcode:
Sobald ich nun das obj TLabel auf das DesignPanel geknallt habe ist das obj nicht mehr gültig
procedure TMainForm.JvDesignPanelGetAddClass(Sender: TObject; var ioClass: String);
da es nun nach der erstellung den Wert 'JvDesignSurface' übernommen hat da der Sender der die funktion 'JvDesignPanelGetAddClass' ausführt nicht das TLabel ist sondern das DesignPanel. Wenn ich nun das Obj TLabel zum Inspector addieren will geht das aber hier nicht mehr da es ungültig ist. Vielleicht versteht man nun besser was ich meine. gruss Emil |
Re: Problem mit Object Inspector
Ach das JvDesignPanel ist das Problem :shock:
Zitat:
Ich nehme an, du arbeitest dich mit Hilfe des Beispiels durch die Komponente. Also soweit ich das JvDesignPanel nach 10 Minuten verstanden habe (ich arbeite nicht damit, da bei mir nichts von TControl abgeleitet ist): Beim Starten der Anwendung muss man dem Designer erst sagen, welche Komponenten überhaupt unterstützt werden sollen. Dies geschieht im Initialization-Teil der Unit:
Delphi-Quellcode:
So, sobald eine neue Komponente hinzugefügt werden soll, wird das "JvDesignPanelGetAddClass" - Event aufgerufen. Jetzt ist es so: wenn eine neue Komponente hinzugefügt werden soll, dann musst du den Klassennamen im Parameter var ioClass: String speichern. Wenn dieser String leer bleibt, dann wird auch keine neue Klasse erstellt. Zu diesem Zeitpunkt gibt es das neue Objekt noch nicht, da das JvDesignPanel ja noch nicht mal weiß, welcher Klassentyp überhaupt erstellt werden soll. So, nachdem das Event fertig ist, wird die neue Klasse erstellt - intern im Designer. Um dann auf eine Klasse zuzugreifen, musst du wahrscheinlich auf die Property Surface zugreifen und dich da irgendwie durchhangeln. Du kannst also in diesem Event NICHT auf das erstelle Objekt zugreifen, da es noch nicht existiert. Wahrscheinlich gibt es ein Event mit dem Namen (OnItemSelected) oder so ähnlich. Dort wirst du entweder das Item direkt als Parameter übergeben bekommen (zu 99.99999% ist es nicht Sender: TObject), oder es gibt eine Property "Selected" oder so.
initialization
RegisterClass(TButton); RegisterClass(TLabel); RegisterClass(TPanel); RegisterClass(TImage); |
Re: Problem mit Object Inspector
Ja ! Denke wir sind auf den richtigen weg..
Ist manchmal schwierig schriftlich etwas rüberzubringen ;) Ja beim Initialisieren der MainForm .. werden die Komponenten registriert.
Delphi-Quellcode:
Erst mal nur die zwei.. :)
initialization
ADate := Now; TJvInspectorAlignItem.RegisterAsDefaultItem; TJvInspectorAnchorsItem.RegisterAsDefaultItem; TJvInspectorColorItem.RegisterAsDefaultItem; TJvInspectorTImageIndexItem.RegisterAsDefaultItem; RegisterClass(TImage); RegisterClass(TLabel); Sobald ich auf das Panel klicke bekommt in
Delphi-Quellcode:
ioClass den Wert TLabel als string übergeben ist auch richtig so.
procedure TMainForm.JvDesignPanelGetAddClass(Sender: TObject; var ioClass: String);
Danach addiere ich das neue Objekt in der gleichen funktion
Delphi-Quellcode:
if DesignClass <> '' then
AddControls(TControl(Sender), DesignClass);
Delphi-Quellcode:
procedure TMainForm.AddControls(aCtrl: TControl; DisplayName: string);
var InspCat: TJvInspectorCustomCategoryItem; begin InspCat := TJvInspectorCustomCategoryItem.Create(JvInspector1.Root, nil); InspCat.DisplayName := DisplayName; JvInspector1.Root.SortKind := iskNone; AddCtrl(InspCat, aCtrl); InspCat.Expanded := True; end;
Delphi-Quellcode:
Und hier ist das problem wie schon gesagt ..
procedure TMainForm.AddCtrl(const Parent: TJvCustomInspectorItem; const Ctrl: TControl);
var InspCat: TJvInspectorCustomCategoryItem; begin InspCat := TJvInspectorCustomCategoryItem.Create(Parent, nil); InspCat.DisplayName := Ctrl.Name + ': ' + Ctrl.ClassName; TJvInspectorPropData.New(InspCat, Ctrl); end; Er addiert zwar das richtige Caption TLabel addiert aber als Parent TjvDesignSurface muss mal schaun ob ich mit den Tips von dir da was machen kann. gruss Emil |
Re: Problem mit Object Inspector
Zitat:
|
Re: Problem mit Object Inspector
Zitat:
Habe es doch nur nochmal zur vervollständigung auseinandergelegt das man genau die reihenfolge sieht warum und wieso das problem auftritt. Könnte ja auch für andere nützlich sein die vielleich mal vor dem gleichen problem stehen. Habe verstanden das es noch nicht existiert. Deshalb ja auch !!! Zitat:
die Komponente im Inspector addieren kann. Bin da noch am suchen :) gruss Emil |
Re: Problem mit Object Inspector
Ach so, das hab ich nicht gewusst, tut mir leid :cheers: - da war ich wohl zu voreilig. Entschuldigung bitte.
Ich dachte, du hast das Problem immer noch, daher meine Reaktion. Ich hab gerade genau das Event gefunden, dass du suchst: OnSelectionChange Eine Implementierung könnte so aussehen:
Delphi-Quellcode:
procedure TForm1.JvDesignPanelSelectionChange(Sender: TObject);
var obj: TObject; begin // falls nichts ausgewählt wurde, abbrechen if length(JvDesignPanel.Surface.Selected) = 0 then exit; // das erste Objekt abrufen Obj := JvDesignPanel.Surface.Selected[0]; // Sicher ist sicher, lieber nochmal überprüfen if Assigned(Obj) then if Obj is TControl then // Jetzt kannst du die Daten in den Objekt-Inspektor laden AddControls(TControl(Obj), Obj.ClassName); end; |
Re: Problem mit Object Inspector
Zitat:
Das ist super hab es direkt versucht und funktioniert. War da auch drin konnte aber nicht direkt was mit anfangen da ich keinen vergleich hatte wann die aktion ausgeführt werden soll mit dem addieren der Controls. gruss Emil |
Re: Problem mit Object Inspector
Liste der Anhänge anzeigen (Anzahl: 2)
Hätte da noch ein paar fragen.
Ich lade die Daten über eine Ini ein Wie kann ich nun innerhalb eines Root sagen wir mal "Splash" einen Label und ein Image addieren so das diese nicht als Root sondern als Child addiert wird ? Hoffe habe mich deutlisch genug ausgedrückt. Beispiel das sind die Daten welche addiert werden. Der Root nennt sich da Splash wo die Childer addiert werden. sähe dann so aus ..
Delphi-Quellcode:
Wie das eigentliche addieren funktioniert ist schon klar..
[Splash]
Image1: TImage // >> addieren Background=Image Label1 : TLabel // >> addieren LabelAlignment=2 LabelFont=segoe ui LabelFontSize=18 LabelFontColor=#ffffff LabelHeight=40 LabelWidth=300 LabelX=250 LabelY=440
Delphi-Quellcode:
Aber hier wird der Font für den label im Root eingefügt nicht wie "Anhang Bild 1" dargestellt als Child
var
aObj: TLabel; begin case TextIndex(ItemName, ['background', 'LabelAlignment', 'LabelFont', 'LabelFontSize', 'LabelHeight',' LabelWidth', 'LabelX',' LabelY']) of 0: begin ItemName := 'background'; ATypeInfo := GeneratedTestEnum; end; 1: begin aObj := Tlabel.Create(nil); TJvInspectorPropData.New(JvInspector1.Root, aObj, GetPropInfo(aObj, 'Font')); ItemName := 'LabelAlignment'; end; 2: ItemName := 'LabelFont'; 3: ItemName := 'LabelFontSize'; 4: ItemName := 'LabelFontColor'; 5: ItemName := 'LabelHeight'; 6: ItemName := 'LabelWidth'; 7: ItemName := 'LabelX'; 8: ItemName := 'LabelY'; else Allow := False; end; end; Außer Root und Parent habe ich nichts gefunden gibt es da noch eine andere möglichkeit ? Mein zweites problem ist das einbinden von einem Button innerhalb eines Item Die einzige möglichkeit die ich gefunden habe ist über GeneratedTestEnum Nur über ein Enum läßt sich ein Button addiern das geschieht dann im Inspector automatisch. Das ist aber nicht der richtige weg oder? Und das letzte warum kann ich wenn ein TImage eingebunden wird beim Eintrag Picture keine datei auswählen ? Hab 2 Bilder angehängt zur vervollständigung. gruss Emil |
Re: Problem mit Object Inspector
Niemand ne Idee wie ich die probleme lösen kann ?
So was wie Hilfeanleitungen scheinen die beim Jedi Projekt nicht zu kennen. :gruebel: gruss Emil |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:27 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-2025 by Thomas Breitkreuz