Autor |
Beitrag |
Licki
      
Beiträge: 132
Knoppix, Win 95, Win 2000, Win NT, Win 98, Win XP
Delphi 3
|
Verfasst: Di 23.09.03 11:34
Hi... Habe mir folgende Prozedur in mein Programm gebastelt. Es wird in der ListBox Dateien von einem Verzeichnis ausgegeben. Es sind Textdateien. Leider weiß ich nicht, wie es funktioniert, dass man die Dateien per Doppelklick in der ListBox öffnen kann. Weiß jemand Rat oder könnte meinen Code ergänzen? Wäre echt klasse... Danke im Voraus.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| var logview: Tlogview;
implementation
{$R *.DFM}
procedure ListFileDir(Path: String; FileList: TStrings); var SR: TSearchRec; begin if FindFirst(Path + '*.*', faAnyFile, SR) = 0 then begin repeat if (SR.Attr <> faDirectory) then begin FileList.Add(SR.Name); end; until FindNext(SR) <> 0; FindClose(SR); end; end;
procedure Tlogview.FormCreate(Sender: TObject); begin ListFileDir('logs\', ListBox1.Items); end;
procedure Tlogview.exit_buttonClick(Sender: TObject); begin LogView.Close; end; |
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 23.09.03 12:16
Du meinst mit
Zitat: | per Doppelklick in der ListBox öffnen |
dass man die Datei anklickt und sich dann bspw. der Texteditor öffnet? Dann schau dir bitte ItemIndex in der Delphi-Hilfe an. Das Ereignis für den Doppelklick im Objektinspektor ... hm ... findest du hoffentlich allein. Und das andere ist dann das übliche: SHELLEXECUTE.
Bevor die Frage kommt: Sollte beim Versuch, die Datei zu öffnen, nichts passieren, dann könnte das daran liegen, dass die Pfadangabe fehlt. Also notfalls noch in der LB ergänzen, da
Delphi-Quelltext 1:
| FileList.Add(SR.Name); |
nur den Dateinamen ohne Pfad in die Listbox schreibt.
|
|
Licki 
      
Beiträge: 132
Knoppix, Win 95, Win 2000, Win NT, Win 98, Win XP
Delphi 3
|
Verfasst: Di 23.09.03 12:35
Daran habe ich auch schon gedacht. Ich habe versucht es zum Test mit ButtonClick zu lösen.
Delphi-Quelltext 1: 2: 3: 4:
| procedure Tlogview.Button1Click(Sender: TObject); begin ShellExecute(Application.Handle, 'open', 'C:\test\logs\' + ListBox1.ItemIndex', nil, nil, SW_SHOW); end; |
Scheint anscheinend ein dummer Fehler zu sein, aber ich komme besten willens nicht darauf.
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: Di 23.09.03 12:53
Licki hat folgendes geschrieben: |
Delphi-Quelltext 1:
| ShellExecute(Application.Handle, 'open', 'C:\test\logs\' + ListBox1.ItemIndex', nil, nil, SW_SHOW); |
|
da erscheinen doch 2 compiler fehlermeldungen, die dir weiterhelfen
1. das der String nicht abgeschlossen ist, da du hinter ListBox1.ItemIndex ein ' zu viel hast
2. Inkompatible Typen: 'String' und 'Integer' Listbox1.itemindex und jetzt überleg mal, ob der itemindex eine zahl oder einen string zurückgibt. und wenn eine Zahl ist, wie du dann über die Listbox1.items[] an deinen String rankommst.
Mfg Frank
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
Licki 
      
Beiträge: 132
Knoppix, Win 95, Win 2000, Win NT, Win 98, Win XP
Delphi 3
|
Verfasst: Di 23.09.03 13:02
Daran habe ich auch schon rumprobiert.
Den Strich hinten weggemacht und IntToString angewendet. Sah dann so aus:
Delphi-Quelltext 1: 2: 3: 4:
| procedure Tlogview.Button1Click(Sender: TObject); begin ShellExecute(Application.Handle, 'open', 'C:\Eigene Dateien\NDC- Transfer\logs\' + IntToStr(ListBox1.ItemIndex), nil, nil, SW_SHOW); end; |
Nun kommt aber inkompitable Typen pchar und String. Habe schon probiert und probiert, komme aber nicht weiter. Selbst wenn ich (pchar(ListBox1.ItemIndex)) funktionert es nicht.
Auf deine Frage, ja, es sind ja Zahlen wo die ListBox-Elemente haben. Also IntToStr oder was mache ich falsch...? 
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: Di 23.09.03 13:30
Licki hat folgendes geschrieben: |
Auf deine Frage, ja, es sind ja Zahlen wo die ListBox-Elemente haben. Also IntToStr oder was mache ich falsch...?  |
was nützt dir die nr mit intstr? wenn du den 2.Eintrag selektiert hast steht dann 'C:\Eigene Dateien\NDC- Transfer\logs\ 1' da, das nützt dir nix oder?
Delphi-Quelltext 1:
| listbox1.items[Listbox1.itemindex] |
und du erhälst den String (gilt nur, wenn multiselect=false) . Prüf aber vorher, ob itemindex nicht -1 (kein item ausgewählt) ist, sonst landest du in einer exception.
Zitat: |
'C:\Eigene Dateien
|
ich weiß nicht, für was/wen dein Programm sein soll, aber bei mir gäbe es da kein Verzeichnis. Meine Syspartition ist D: und unter Win2K gib es keinen Ordner D:\eigene Dateien . such mal im Forum unter Systemverzeichnisse ermitteln.
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
Licki 
      
Beiträge: 132
Knoppix, Win 95, Win 2000, Win NT, Win 98, Win XP
Delphi 3
|
Verfasst: Di 23.09.03 14:07
Es ist eine Zusatzfunktion in einem Programm. In dem Ordner logs werden Logdateien gespeichert. Diese werden in ListBox1 ausgegeben. Nun will ich aber, dass ich per Doppelklick auf einen Dateinamen diese auch starten kann. Ich komme leider nicht darauf, wie es gehen sollte.
Dachte mit ShellExecute geht es einfacher, aber nunja...  Hoffe es hat doch jemand ein Stückchen Code für mich...
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 23.09.03 16:18
Du machst schlicht und einfach einen Denkfehler. Hättest du bereits beim Lesen von Keldorns letztem Posting merken müssen.
ItemIndex liefert dir den Index des ausgewählten Eintrags (sprich: den Dateinamen) in der Listbox, bzw. -1 wenn nichts ausgewählt ist. Du musst also diesen Index (null-basierend; soll heißen: erster Dateiname hat den Index Null) benutzen und auf die Eigenschaft Items zugreifen
Delphi-Quelltext 1:
| ShowMessage(ListBox1.Items[ListBox1.ItemIndex]); |
Voilà, hast du den Namen zur Übergabe an ShellExecute.
Allerdings würde ich mir den Tipp von Keldorn durch den Kopf gehen lassen, denn "C:\Eigene Dateien" gibt´s bei mir auch nicht. 
|
|
Licki 
      
Beiträge: 132
Knoppix, Win 95, Win 2000, Win NT, Win 98, Win XP
Delphi 3
|
Verfasst: Mi 24.09.03 12:08
Danke, das ist echt gut so.  Habe da echt ein bißchen zu wenig gedacht.... Nunja, wieder etwas mehr gelernt und für das nächste mal weiß ich es...
Mit dem Verzeichnis, ja, dass ist klar, sollte nur als Beispiel dienen, wird natürlich noch angepasst mit dem aktuellen Verzeichnis. Oder Systemverzeichnisse, je nachdem für was ich es genau einsetzte.
Nun habe ich jedoch noch ein Problem. Mit ShellExecute. Ok, ihr werdet sicher lachen, aber ich habe wieder einige Stunden rumprobiert und ich bin einfach zu doof es an ShellExecute zu übergeben.
Delphi-Quelltext 1: 2: 3: 4:
| procedure Tlogview.Button1Click(Sender: TObject); begin ShellExecute(Application.Handle, 'open', 'logs\'+ ListBox1.Items[ListBox1.ItemIndex]'', nil, nil, SW_SHOW); end; |
Was mache ich da falsch? Ich bekomme die Fehlermeldung "Operator oder Semikolon" fehlt. Aber wenn ich nen Semiklon setzte oder sonst noch welche Operatoren, wo es seien könnten bekomme ich auch nur Fehler.  Hoffe jemand kann mir sagen, wie das richtig geht, damit ich sehe, was ich falsch gemacht habe.
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: Mi 24.09.03 13:09
was sollen denn die die 2 ' hinter [ListBox1.ItemIndex]?
da würde ein + Zeichen (operator) fehlen, in deinem Fall brauchst du die '' ja aber gar nicht
und bevor du wieder fragst (inkompatible Typen pchar und string)
Delphi-Quelltext 1:
| ...pchar(Verzeichnis+ListBox1.Items[ListBox1.ItemIndex]),... |
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
Licki 
      
Beiträge: 132
Knoppix, Win 95, Win 2000, Win NT, Win 98, Win XP
Delphi 3
|
Verfasst: Mi 24.09.03 14:24
Hm, das funktioniert irgendwie nicht, egal, wie ich es hinstelle. Kannst du mir das mal machen, damit ich sehe, wie das genau geht?
|
|
|