ComboBox mit Datein aus Ordner fühlen

Power-Poler

Mitglied
Hi
Ich habe volgendes Problem, und zwar würde ich gerne eine ComboBox mit Datein, Automatisch, also wenn eine dazu kommt, das die auch geaddet wird, fühlen.

Ich habe da zwar einen Befehl gefunden, aber irgenwie weis ich nicht, was der von mir erwartet
Code:
ComboBox1.GetNamePath
Was muss ich da hinten dran schreiben, das es funtzt?
Also vorstellen, tu ich mir das so wie in einer FileListBox
Danke im Voraus
MfG
Power-Poler
 
Also ich sage mal ganz blauäugig: Mit GetNamePath kommst du schon mal gar nicht weiter. Ich habe eine ähnliche Funktion hier in meinem Projekt, die ich mal etwas umgeschrieben und kommentiert habe. Ich sollte noch anmerken, dass das Ganze für Delphi .net ist und für reines Delphi w32 evtl. die Methodenparameter angepasst werden müssen.
Code:
procedure TIrgendeineKlasse.GetAvailableFiles(pComboBox: TComboBox);
var
  lDir: String;                   // Startverzeichnis für die Filesuche
  lSearchRecord: TSearchRec;      // zum Suchen selbst
begin
  // Wenn ich schon nach den verfügbaren Dateien suche, dann will ich aber
  // keine doppelten Einträge von vorherigen Dateisuchen
  pCombobox.Clear;

  // Ich suche nur im gleichen Verzeichnis, in dem auch die EXE meines
  // Programms läuft
  lDir := IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName));

  // Existiert überhaupt irgendeine Datei im gewünschten Format?
  // (hier eine EXE-Datei).
  if FindFirst(lDir + '*.exe', faAnyFile, lSearchRecord) = 0 then
  begin
    repeat
      if (lSearchRecord.Attr <> faDirectory) then
        pComboBox.Items.Add(lSearchRecord.Name);
    until FindNext(lSearchRecord) <> 0;

    // Suche abschliessen
    FindClose(lSearchRecord);
  end;
end;

Aber jetzt kommt es natürlich vollkommen darauf an, wann die Methode aufgerufen wird. Du willst ja, dass sich die Combobox quasi "von selbst" aktualisiert. Aber dieses "von selbst" sollte schon etwas genauer bestimmt sein.
Eine Möglichkeit ist, die Application.OnIdle zu überschreiben (Suchworte: +Delphi +OnIdle) und innerhalb der neuen OnIdle die Methode auszuführen. Dann würde deine Combobox immer dann aktualisiert werden, wenn dein Programm gerade nichts zu tun hat. Klassischesr Einsatz: Aktualisierung eines Statusbars.

Alternativ (wenn die Aktualisierung deiner ComboBox wirklich richtig dringend und wichtig ist) lassen sich auch speziell für diesen Task Resourcen verbraten und ein Timer einsetzen. (Suchworte: +Delphi +TTimer). Einfach obige Routine in die Ereignismethode des Timers packen und schon kannst du bestimmen wann und wo nach neuen Methoden gesucht wird.
Klassischer Einsatz: Timer zum automatischen Logout nach einer gewissen Inaktivität bei einem Usermanagement.

Als weitere Möglichkeit fiele mir noch die OnDraw-Methode des der ComboBox übergeordneten Formulars ein. Da ist aber u.U. ein bißchen Gebastel notwendig, damit es zu keiner Null Pointer-Exveption kommt (Create, FreeAndNil).
Klassischer Einsatz: Alles mögliche, was auf dem Formular angezeigt wird. Ist fast so etwas wie eine Standard-Refresh-Art.

Ich persönlich würde in diesem Falle wohl die OnIdle-Methode verwenden.
 
Hi
Danke für die Antwort, es geht!
Ich möchte jetzt aber gerne, das er nicht da sucht, wo die exe ist, sondern in einem Vorgegebenen Order, wo muss ich das dan hineinschreiben?
Villeicht ist die lösung ganz einfach, aber ich bin nicht so der Pro in Delphi. (Habe erst angefangen).
Edit: Habs doch noch gefunden.
Danke nochmals, jetzt kans weitergehn.
Mit der Aktualisirung, habe ich gemeint: Immer wenn ein neues File geschrieben wird, soll das hinzugefügt werden.

So, jetzt stehe ich schon vor dem nächsten Problem, bei dem du mir hofendlich weiter helfen kanst:
Ich will, dass wenn man eine gefundene Datei darin anklickt, diese erkannd wird, und in einer Variableb gespeichert wird:
Code:
filename := FileListBox1.FileName;
Also das er wie bei einer FileListBox das addet. Ich finde leider keinen Befehl dafür, der dies so wie im code fenster ausführt.
 
Zuletzt bearbeitet:
Hi
Mit der Aktualisirung, habe ich gemeint: Immer wenn ein neues File geschrieben wird, soll das hinzugefügt werden.
Und woran EXAKT soll dein Programm erkennen, ob eine Datei geschrieben wurde oder nicht?
Soll dein Programm sämtliche Plattentätigkeit überprüfen?
Oder steht nur ein bestimmtes Verzeichnis zur Überprüfung an?
Gibt es irgendwelche anderen Merkmale außer dem direkten Directory, anhand derer man feststellen könnte, dass eine neue Datei zur Sammlung dazu gekommen ist?

Ich will, dass wenn man eine gefundene Datei darin anklickt,
Was ist "darin"?

diese erkannd wird,
Was verstehst du unter "erkannt"?

Also das er wie bei einer FileListBox das addet.
Was meinst du mit "das"?

Ich finde leider keinen Befehl dafür, der dies so wie im code fenster ausführt.
Welchem Codefenster?

Ehrlich: Drück' dich mal präziser aus, dann kann ich dir evtl. auch weiterhelfen. Wie soll ich genaue Hilfestellung bei solch ungenauen Angaben leisten?
 
1. Es wird nur eine *.ini in einem Bestimmten Verzeichnis erzeugt, sobald man den Kopf für Speichern drückt. Also immer wenn der Knopf gedrückt wird, soll sich die liste Aktualisiren.
2. Wenn man in der ComboBox auf eine der geaddeten dateien klickt, so dass diese "Aktiv" wird, also, wenn sie oben in der ComboBox steht.
3. Das diese ausgewählte Datei als Ausgewählte Datei aktzebtiert wird, und der Name in einer Variablen gespeichert wird, das ich im weiteren Verlauf des codes sagen kann: "Lies den Inhalt".
4. Bei einer FileListBox ist der Befehl dafür ja: "FileName", aber sowas steht bei einer ComboBox leider nicht zu verfügung.
Sorry, dass ich mich so unverständlich ausgedrückt habe, hoffe jetzt ist es genauer beschrieben.
Danke, fals du mir immer noch helfen wilst.
 
Na, dann wollen wir mal...
1. Es wird nur eine *.ini in einem Bestimmten Verzeichnis erzeugt, sobald man den Kopf für Speichern drückt. Also immer wenn der Knopf gedrückt wird, soll sich die liste Aktualisiren.
Na perfekt. Dann lässt sich ja der entsprechende Aufruf leicht in die OnButton-Methode einbauen und die brauchst nicht großartig die ganze Festplatte kontrollieren.
Das würde dann ungefähr so aussehen:
Code:
procedure TForm1.Button1Click(Sender: TObject);
begin
  { mache irgendwas, wenn auf deinen Button geklickt wurde }
  ...
  GetAvailableFiles(ComboBox1);
end;

2. Wenn man in der ComboBox auf eine der geaddeten dateien klickt, so dass diese "Aktiv" wird, also, wenn sie oben in der ComboBox steht.
Ah, ok.
Das funktioniert bei einer TComboBox einerseits über TComboBox.ItemIndex, andererseits über TComboBox.Text. In beiden Fällen ist die Onlinehilfe dein Freund (auch wenn leider keine Sourcebeispiele mehr drin enthalten sind).

3. Das diese ausgewählte Datei als Ausgewählte Datei aktzebtiert wird, und der Name in einer Variablen gespeichert wird, das ich im weiteren Verlauf des codes sagen kann: "Lies den Inhalt".
Da ginge Folgendes:
Code:
type TForm1 = class(TForm)
published
  SelectedFile: String;

...

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  if ComoBox1.ItemIndex <> -1 then
    TFrom1.SelectedFile := ComboBox1.Items[ComboBox1.ItemIndex]
  else
    TForm1.SelectedFile := '';
end;

alternativ:

Code:
type TForm1 = class(TForm)
published
  SelectedFile: String;

...

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  TFrom1.SelectedFile := ComboBox1.Text;
end;


4. Bei einer FileListBox ist der Befehl dafür ja: "FileName", aber sowas steht bei einer ComboBox leider nicht zu verfügung.
Dafür steht bei einer TComboBox der ausgewählte Inhalt im Property Text, also z.B.
Code:
Filename := ComboBox1.Text;
Geht aber eben auch über den ItemIndex. Viele Wege führen nach Rom.

Abseits dieser Thematik möchte ich dir dann aber noch etwas ans Herz legen:
Wenn du im Forum was schreibst, lies mal bitte wirklich, was da oberhalb des Eingabefensters in fetter roter Farbe steht. Danke.
 
Danke für deine Hilfe, meine ComboBox funktioniert jetzt so wie sie soll.
Fals du meine Rechtschreibung bemängelst, bin legasteniker, und habe zurzeit kein Word oder Sonstiges auf dem PC um eine Rechtschreibprüfung laufen zu lassen.
 
Legasthenie ist eine Sache, aber man kann doch trotzdem vollständige Sätze ausformulieren, auch wenn nicht zwingend jeder Buchstabe am richtigen Platz ist, oder?
Und ja - darauf hatte ich angedeutet. ;)
 

Neue Beiträge

Zurück