![]() |
Stringliste in einem Collectionitem
Bei der Entwicklung einer Componente für Menüs (sie erweitert TMenu's quasi) benutze ich eine Collection die mir Erweiterte Attribute für jeden Menüpunkt speichern soll. U.a. auch einen Beschreibungstext (TStrings).
Alle Published-Eigenschaften des items der Collection werden auch wunderbar in die DFM geschrieben, sogar die Stringliste. Alle Eigenschaften werden auch wieder gelesen...nur die die Stringliste nicht. Deren Inhalt ist nach den neuladen des Projekts verschwunden (obwohl sie in der DFM steht !). Hier mal die Decl's der beiden Klassen:
Delphi-Quellcode:
Die Stringliste (Description) wird ganz normal im Constructor erzeugt, im Descrutor freigegeben und in der Set-Methode via assign zugewiesen.
//Das Item !
TExtendedItem = Class(TCollectionItem) PRIVATE fwaschanged : boolean; fItem : TMenuitem; fDescription : TStrings; //Needed only internal; fOldFont : TFont; fOldBrush : TBrush; fOldPen : TPen; fOldStyle : TElementStyles; procedure SetItem(const Value: TMenuitem); function IsToplevel:boolean; function IsSeperator:boolean; procedure SetDescription(const Value: TStrings); PROTECTED procedure SaveCanvas(ACanvas:TCanvas;style:TElementStyles); procedure RestoreCanvas(ACanvas:TCanvas;style:TElementStyles); procedure SetFont(ACanvas:TCanvas;AFont:TStylefont); function MakeCaption(Withshortcut:boolean=FALSE):String; PUBLIC constructor Create(Collection: TCollection); override; Destructor Destroy;Override; Procedure Assign(Source:TPersistent);override; //Painting and Measuring; procedure DrawItem(ACanvas:TCanvas;ARect:TRect;state:TOwnerDrawState;fstyle:TElementStyles); Function MeasureItem(ACanvas:TCanvas;fstyle:TElementStyles):TSize; PUBLISHED property WasChanged : boolean read fwaschanged; Property Item : TMenuitem read fitem write SetItem; Property Description : TStrings read fDescription write SetDescription; End; //Die Collection TExtendedItems = class(TCollection) PRIVATE fExtendedMenu : TExtendedMenu; function GetItem(index: integer): TExtendedItem; procedure SetItem(index: integer; const Value: TExtendedItem); PROTECTED Procedure Update(Item:TCollectionItem);override; function GetOwner:TPersistent;override; PUBLIC Constructor Create(AMenu:TExtendedMenu); function Add:TExtendedItem; property Items[index:integer]:TExtendedItem read GetItem write SetItem;default; function IndexOfMenuItem(AItem:TMenuItem):integer; end; Solange ich mein Test-Projekt in der IDE hab, funktioniert alles wunderbar, sobald ich aber das Projekte schließe und neu lade, ist die Stringliste leer. Woran kann das liegen ? |
Re: Stringliste in einem Collectionitem
Ergänzung:
Hab grad mal die Propertie von Stringlist auf String geändert.....mit dem gleichen Ergebnis. Irgendwie..versteh ich das nicht wirklich. |
Re: Stringliste in einem Collectionitem
Interessant sind glaube auch die Codes der Constructors/Destructors :wink:
|
Re: Stringliste in einem Collectionitem
Das soll nicht das Problem sein.
Alle Stellen an denen die Stringliste selbst manipuliert wird:
Delphi-Quellcode:
Für die Collection:
constructor TExtendedItem.Create(Collection: TCollection);
begin inherited create(Collection); fdescription:= TStringlist.create; fitem := NIL; fwaschanged := FALSE; end; destructor TExtendedItem.Destroy; begin freeAndNil(fdescription); inherited; end; procedure TExtendedItem.Assign(Source: TPersistent); begin if (source is TExtendedItem) then begin fdescription.Assign(TExtendedItem(source).fdescription); fwaschanged := TRUE; end else inherited assign(source); end; procedure TExtendedItem.SetDescription(const Value: TStrings); begin fdescription.assign(Value); fwaschanged := true; end;
Delphi-Quellcode:
constructor TExtendedItems.Create(AMenu: TExtendedMenu); begin Inherited Create(TExtendedItem); fExtendedMenu := AMenu; end; |
Re: Stringliste in einem Collectionitem
Hab es mal in einer Mini-Komponente getestet und kann da nix erkennen... bei mir läuft das einwandfrei... allerdings nutz ich Delphi 7. evtl. ein Turbo-Delphi Bug? :gruebel:
Delphi-Quellcode:
EDIT: Darf ich mir mal GetItem/SetItem von TExtendedItems ansehn?
unit teststrings;
interface uses SysUtils, Classes; type TSlItem = class(TCollectionItem) private fstrings: TStrings; procedure SetStrings(const Value: TStrings); protected public constructor Create(Collection: TCollection); override; destructor Destroy; override; published property Lines: TStrings read fstrings write SetStrings; end; Tteststrings = class(TComponent) private flist: TCollection; procedure SetList(const Value: TCollection); protected public constructor Create(AOwner: TComponent); override; destructor Destroy; override; published property List: TCollection read flist write SetList; end; procedure Register; implementation procedure Register; begin RegisterComponents('Cruiser', [Tteststrings]); end; { TSlItem } constructor TSlItem.Create(Collection: TCollection); begin inherited; fstrings := TStringList.Create; end; destructor TSlItem.Destroy; begin fstrings.Free; inherited; end; procedure TSlItem.SetStrings(const Value: TStrings); begin fstrings.Assign(Value); end; { Tteststrings } constructor Tteststrings.Create(AOwner: TComponent); begin inherited; flist := TCollection.Create(TSlItem); end; destructor Tteststrings.Destroy; begin flist.Free; inherited; end; procedure Tteststrings.SetList(const Value: TCollection); begin flist.Assign(Value); end; end. |
Re: Stringliste in einem Collectionitem
Delphi-Quellcode:
hm...das mit D7 ist ne gute Idee.
function TExtendedItems.GetItem(index: integer): TExtendedItem;
begin result := TExtendedItem(inherited GetItem(index)); end; procedure TExtendedItems.SetItem(index: integer; const Value: TExtendedItem); begin Inherited SetItem(index,value); end; |
Re: Stringliste in einem Collectionitem
Da ist glaube der Hund begraben:
Delphi-Quellcode:
sicher, dass du HIER ein inherited willst?
procedure TExtendedItems.SetItem(index: integer; const Value: TExtendedItem);
begin Inherited SetItem(index,value); end; PS: :wall: ja.. nee... klar willst du das... ach menno... ich find jedenfalls nix... sorry. |
Re: Stringliste in einem Collectionitem
Jap...ich will ja die Liste aktuallisieren (bzw. das Item in der Liste).
Ich habs alternativ auch mal mit
Delphi-Quellcode:
probiert, bringt aber keine Änderung.
items[index].assign(value);
D7 (Prof.) hängt sich bei mir auf, wenn ich ein Testprojekt mit meiner Komponente neu lade. Interresant...aber ich schätz mal das das wohl auf Änderungen im Bereich TMainMenu bzw. TMenuitem zurück zu führen ist. EDIT: Ich glaub ich werd das ganze mal unter D7 neu hochziehen und guggen ob ich es dort zum laufen krieg und dann rüberziehen auf TD 2006. |
Re: Stringliste in einem Collectionitem
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab das Teil nun soweit runtergedröselt, das es nur noch ums speichern der Beschreibung in der DFM geht....aber ich komm einfach nicht dahinter, wo das Problem liegt. Weder unter D7 noch unter TD läd er mir die Beschreibung wieder aus der DFM. Im Anhang mal die Unit (Item, Collection und Componente).
|
Re: Stringliste in einem Collectionitem
Tach!
Ich hab mir deine abgemagerte Kompo mal in D2005 installiert und es funktioniert - denke ich :). Folgende DFM
Delphi-Quellcode:
kann ich von Formular- auf Textansicht umstellen, zu- und wieder aufmachen - das bla blubb bleibt erhalten. Und bei dir verschwindet es, richtig?
object Form1: TForm1
Left = 0 Top = 0 Width = 347 Height = 240 Caption = 'Form1' Color = clBtnFace ParentFont = True OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13 object ExtendedMenu1: TExtendedMenu ExtendedMenuItems = < item Beschreibung.Strings = ( 'bla' 'blubb') end> Active = False Left = 160 Top = 104 end end |
Re: Stringliste in einem Collectionitem
Nicht ganz. in der DFM bleibts schon drin. Nur werden die Einträge dafür beim laden des Projektes nicht wieder eingelesen.
Also, wenn du das Projekt schließt und wieder neu aufmachst, is nix da. |
Re: Stringliste in einem Collectionitem
Zitat:
Meine Delphi-Installationen außer D2005 sind leider nicht mehr funktionsfähig, sonst würde ich das auch mal ausprobieren. Sorry, dass ich dir da nicht helfen kann. Ciao, Uli. PS: Was machst du eigentlich an einem Freitagabend vorm PC? :) |
Re: Stringliste in einem Collectionitem
Frage zurück :P aber uhm... ich kann es ebensfalls nicht nachvollziehen... Projektoptionen evtl.? Denn am Code liegts offenbar nich.
|
Re: Stringliste in einem Collectionitem
Also...langsam glaub ich das meine Delphi-Installationen im Eimer sind.
Ich lade das Projekt. Gug mir das in der IDE an....nix in der Stringliste, nix in der DFM. Ich öffne die gleiche DFM im Notepad -> Einträge da.... Öffne ich direkt die DFM in der IDE (ohne Projekt, in der Textansicht) -> Einträge da Schalte ich um auf Formular-Ansicht -> Einträge weg Wieder zurück auf Textansicht -> Einträge weg Im Notepad -> Einträge da. Ich glaub echt mein Hamster bonnert. |
Re: Stringliste in einem Collectionitem
:wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall:
ICH BIN BLIND :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: Hab den Fehler gefunden. Es lag nicht an Delphi sondern an meiner Componente. Die hat die Items gelöscht und neu erzeugt, wenn das Menü gesetzt wird, was praktisch dauernd passiert. Danke an alle die versucht haben zu helfen :) |
Re: Stringliste in einem Collectionitem
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:49 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