![]() |
Delphi-Version: XE8
Die seltsame Combobox
Hi zusammen
Mit diesem Array kann ich festlegen, - bzw. sollte ich festlegen können - welche Dateien mir von meinem PathfinderFrame angezeigt werden sollen:
Delphi-Quellcode:
Der Constructor meines PathfinderFrames ruft dazu die prozedur FileMaskInit auf:
const
VALID_EXTENSIONS: array[0..5] of string = ('alle Dateien', '.bmp', '.nef', '.jpg', '.png', '.pdf');
Delphi-Quellcode:
Erstmal hatte ich es mit der auskommentierten Zeile versucht. Resultat: Im Textfeld der Combobox steht der zugewiesene String (.pdf).
procedure TPathFinderFrame.FileMaskInit;
var i: integer; begin for i := Low(VALID_EXTENSIONS) to High(VALID_EXTENSIONS) do begin // CmbxFileType.Items.Add(VALID_EXTENSIONS[i]); if i = 5 then CmbxFileType.Text := '.pdf'; //IntToStr(FDefaultType); CmbxFileType.AddItem(VALID_EXTENSIONS[i], nil); end; FileSearcher1.FileMask := VALID_EXTENSIONS[5]; end; Der Rest der Box(die aufklappbare Liste) ist leer.
Vor einiger Zeit habe ich bemerkt, das die Basisframes einer Anwendung vor der Mainform erstellt werden - weswegen, ist wohl leicht denkbar. So kam ich auf die Idee, dass dies eventuell der Grund für das seltsame Verhalten ist - aber das ist nicht wirklich nachvollziehbar, wenn einerseits der Text-String eingetragen wird, nicht aber die Items-Strings... Also bleibt die Frage: Wieso das? Gruss Delbor |
AW: Die seltsame Combobox
AddItem ist hier wirklich komplett falsch. Du musst schon Items.Add nehmen. Dann sollte es auch gehen.
|
AW: Die seltsame Combobox
Zitat:
Delphi-Quellcode:
procedure TCustomCombo.AddItem(Item: String; AObject: TObject);
begin Items.AddObject(Item, AObject); end; |
AW: Die seltsame Combobox
Ich verstehe nicht, was Du vorhast, ich kann es nur erahnen ;-)
Delphi-Quellcode:
Eventuell so?
procedure TPathFinderFrame.FileMaskInit;
var i: integer; begin for i := Low(VALID_EXTENSIONS) to High(VALID_EXTENSIONS) do begin // CmbxFileType.Items.Add(VALID_EXTENSIONS[i]); if i = 5 then // Warum fünf? Änder mal das Array und??? CmbxFileType.Text := '.pdf'; //IntToStr(FDefaultType); CmbxFileType.AddItem(VALID_EXTENSIONS[i], nil); end; FileSearcher1.FileMask := VALID_EXTENSIONS[5]; end;
Delphi-Quellcode:
procedure TPathFinderFrame.FileMaskInit;
var i: integer; begin CmbxFileType.Items.Clear; for i := Low(VALID_EXTENSIONS) to High(VALID_EXTENSIONS) do begin CmbxFileType.AddItem(VALID_EXTENSIONS[i], nil); end; CmbxFileType.Text := VALID_EXTENSIONS[FDefaultType]; FileSearcher1.FileMask := CmbxFileType.Text; // oder CmbxFileType.ItemIndex := FDefaultType; FileSearcher1.FileMask := CmbxFileType.Items[FDefaultType]; end; |
AW: Die seltsame Combobox
Hi zusammen
Die Lösung bahnte sich an, als ich versuchte, die Prozedur von der Mainform aus aufzurufen:
Delphi-Quellcode:
Das war erstmal nicht möglich, da ich die Prozedur im Basisframe gewohnheitsmässig private deklariert hatte. Also änderte ich das und verschob die Deklaration in den Puplic-Abschnitt.
procedure TPDFOfficerMain.FormCreate(Sender: TObject);
var LFTextSelection : String; begin // DoTextSelectionEvent := PathFinderFrame1.OnTextSelectionEvent; FAppDataPath := 'C:\PDFOfficerAppdata'; PathFinderFrame1.OnTextSelectionEvent := DoTextSelectionEvent; // PathFinderFrame1.FileMaskInit; //<== Aufruf von hier if Fileexists(FAppDataPath+'\TVNameitems.txt') then begin FSettingDefault := False; TVName.LoadFromFile(FAppDataPath+'\TVNameitems.txt'); end else begin FSettingDefault := true; FillTVName; end; end; Dabei vergass ich, den Aufruf von FileMaskInit aus dem Constructor des Basisframes zu entfernen. Resultat: Die Items der Combobox waren jetzt doppelt vorhanden. Fazit: der Basisframe vererbt an seine Instanzen nur das, was public deklariert ist - was ich eigentlich wissen müsste. Zitat:
Die Hilfe führt AddItem als Methode von TCustomCombo auf. Gruss Delbor |
AW: Die seltsame Combobox
Hi Delphi.Narium
Das mit dem leeren der Combobox muss ich noch einbauen, da deren Itemstext ansonsten bei jeder Änderung um die Länge des Arrays zunimmt - auf der andern Seite zeigte mir genau das doppelte Vorhandensein der Items meinen Fehler auf. Das Feld FDefaultType hatte ich eingeführt, weil es möglich sein soll, einen Defaulttype anzuzeigen. Allerdings hatte ich da einen Denkfehler begangen: der Feldname FDefaultType kann nicht Teil meines Stringarrays sein, sondern allenfalls eines Aufzählungstyps wie zB.
Delphi-Quellcode:
TFileType = (ftDefaultType , ftBMP, ftNEF, ftJPG, ftPNG,ftPDF);
Hier könnte eine Funktion in einem Case-of-Block einen ExtenssionString ermitteln:
Delphi-Quellcode:
Beim Array wärs grundsätzlich dasselbe, mit dem Unterschied, dass die gesuchten Strings (Result der Funktion) an den Ordinalpositionen schon vorhanden sind.
case FFileType of of
ftDefaultType : Result := '.' ftBMP : Result := '.bmp'; ftNEF : Result := '.nef'; ftJPG : Result := '.jpg'; ftPNG : Result := '.png'; ftPDF : Result := '.pdf'; end; Ich schreibe dies hier übrigens so ausführlich, weil mir die Unterschiede von Aufzählungs-, Mengen- und Arraytypen keineswegs wirklich geläufig sind und ich hoffe, dies auf diese Weise etwas verbessern zu können. Gruss Delbor |
AW: Die seltsame Combobox
Setz mal den ItemIndex
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:12 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