Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Die seltsame Combobox (https://www.delphipraxis.net/194833-die-seltsame-combobox.html)

Delbor 11. Jan 2018 17:06

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:
 const
  VALID_EXTENSIONS: array[0..5] of string = ('alle Dateien', '.bmp', '.nef', '.jpg', '.png', '.pdf');
Der Constructor meines PathfinderFrames ruft dazu die prozedur FileMaskInit auf:
Delphi-Quellcode:
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;
Erstmal hatte ich es mit der auskommentierten Zeile versucht. Resultat: Im Textfeld der Combobox steht der zugewiesene String (.pdf).
Der Rest der Box(die aufklappbare Liste) ist leer.
  • Dann habe ich jene Zeile hinter die if-Abfrage verschoben
  • Dann durch Additem ersetzt
Logischerweise hat das nichts geändert ...

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

Redeemer 11. Jan 2018 18:34

AW: Die seltsame Combobox
 
AddItem ist hier wirklich komplett falsch. Du musst schon Items.Add nehmen. Dann sollte es auch gehen.

Uwe Raabe 11. Jan 2018 19:07

AW: Die seltsame Combobox
 
Zitat:

Zitat von Redeemer (Beitrag 1390833)
AddItem ist hier wirklich komplett falsch. Du musst schon Items.Add nehmen. Dann sollte es auch gehen.

Wirklich komplett falsch?
Delphi-Quellcode:
procedure TCustomCombo.AddItem(Item: String; AObject: TObject);
begin
  Items.AddObject(Item, AObject);
end;

Delphi.Narium 11. Jan 2018 20:02

AW: Die seltsame Combobox
 
Ich verstehe nicht, was Du vorhast, ich kann es nur erahnen ;-)
Delphi-Quellcode:
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;
Eventuell so?
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;

Delbor 11. Jan 2018 20:04

AW: Die seltsame Combobox
 
Hi zusammen

Die Lösung bahnte sich an, als ich versuchte, die Prozedur von der Mainform aus aufzurufen:
Delphi-Quellcode:
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;
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.
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:

Zitat von Redeemer (Beitrag 1390833)
AddItem ist hier wirklich komplett falsch. Du musst schon Items.Add nehmen. Dann sollte es auch gehen.

Leider hast du meinen Eingangsthread etwas flüchtig gelesen - ich hatte beides versucht, und beides ging schief. Ich bin übrzeugt: public deklariert würde auch beides funktionieren.
Die Hilfe führt AddItem als Methode von TCustomCombo auf.

Gruss
Delbor

Delbor 11. Jan 2018 21:04

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:
  case FFileType of of
  ftDefaultType : Result := '.'
  ftBMP : Result :=  '.bmp';
  ftNEF : Result := '.nef';
  ftJPG : Result := '.jpg';
  ftPNG : Result := '.png';
  ftPDF : Result := '.pdf';
  end;
Beim Array wärs grundsätzlich dasselbe, mit dem Unterschied, dass die gesuchten Strings (Result der Funktion) an den Ordinalpositionen schon vorhanden sind.

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

Sailor 11. Jan 2018 21:07

AW: Die seltsame Combobox
 
Setz mal den ItemIndex


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:02 Uhr.

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