Delphi: externe Dateien aufrufen

Hallo,

Folgende 2 Fragen:

1) Ich suche in Delphi grade eine Funktion mit der ich eine externe Datei öffnen kann (Es soll so werden dass nach dem Klick auf einen bestimmten Button eine Textdatei, die auf Festplatte liegt, geöffnet wird).

2) Ist es möglich, die Datei immer von dem Ordner des Programmes aufzurufen? Damit meine ich, dass kein fester Pfad benutzt wird sondern Delphi immer in dem Ordner sucht, in dem das entsprechende Programm liegt, ganz egal wohin das Ganze auch kopiert wird.
 
Versuchs mal damit !

1)

Code:
procedure TForm1.Button1Click(Sender: TObject);
var
  datei:TFileStream;
  LoadString:string;
begin
  datei:=TFileStream.Create (ExtractFilePath(Paramstr(0)) + 'test.txt', fmOpenRead);
  try
    SetLength (LoadString, datei.Size);
    datei.Read (LoadString[1], datei.Size);
  finally
    datei.Free;
  end;
end;

2)
befehl:
ExtractFilePath (Ist oben auch angewand)
 
Danke, ich baue es dann gleich mal ins fertige Programm mit ein :)

Edit: Irgendwie scheint es doch Probleme zu geben, ich hab es exakt so gemacht wie oben beschrieben und es läuft soweit auch doch nach Klick auf den Button wird keine Datei geöffnet.
Die Datei test.txt ist vorhanden und liegt im Verzeichnis des Proggies. Ansonsten hab ich am obrigen Quelltext nichts geändert. Muss ich noch irgendwas beachten?
 
hi!

1. sicher das die datei nicht geöffnet wird? oder bloß vergessen die daten ins edit schreiben zu lassen?
2. solle laufend (von nem zweiten prozess) in die datei geschrieben werden? ansonsten gibts vielleicht nen einfacheren weg für dich:

Code:
procedure tform1.clickmich(sender:tbutton);
var datei:textfile;
      text: string; 
begin
         // datei zuweisen
         assignfile(datei, ExtractFilePath(Paramstr(0)) + 'test.txt');
         // was hast du mit der datei vor?

         //lesen
         reset(datei);
         while not eof(datei) do //bis zum ende der datei
         begin
                  readln(datei, text);
                  memo1.lines.add(text);
         end;

         //überschreiben
         rewrite(datei);
         text:=edit1.text;
         writeln(datei,text);

         //oder anhängen?
         append(datei);
         text:=edit1.text;
         writeln(datei,text);
         Flush(f);

         //schließen nicht vergessen
         closefile(datei);          
end;

alles klar? na denne...
 
Hallo,

Sorry, ich glaub ich hab mich hier zu ungenau ausgedrückt: Ich wollte keine Datei in einem Edit darstellen oder etwas ähnliches, ich wollte eine Textdatei ganz normal öffnen, so wie in Windows eben mit einem Doppelklick.

Puh, ich hoffe das war verständlicher :)

Edit: Soll mit folgendem Befehl möglich sein:
Code:
Process.Start("Editor","c:\\test.txt");

Leider läuft er damit aber nicht. Ich hoffe nur das liegt nicht daran dass ich noch Delphi 3 benutze.
 
Code:
uses shellapi;
...
shellexecute(form1.handle,nil,'NOTEPAD.EXE','test.txt','',1);

Mit shellexecute müsste es gehen !
 
k,
dann lag ich natürlich reichlich daneben. vielleicht hilfts ja mal 'nem anderen user. sind ja ganz gängige befehle...

mfg
 
Hat geklapt, danke @ all!

Eine Frage hab ich aber doch noch: Ist es möglich, die txt-Datei, die ich anzeigen lasse, irgendwie in die exe-Datei die Delphi produziert zu integrieren?
Mein Problem ist folgendes: Wenn man nur die exe-Datei, die am Ende rauskommt, auf einen anderen PC kopiert und da ausführen will wird die txt-Datei logischerweise nicht gefunden und ich möchte vermeiden sie noch extra kopieren zu müssen. Jetzt wäre es also ganz praktisch, wenn die txt-Datei irgendwie mit der exe-Datei zusammenhängen würde, so dass ich am Ende nur eine Exe-Datei habe, die ich problemlos auf alle PC's kopieren und da ausführen kann.

Müsste doch eigentlich irgendwie machbar sein, oder?
 
hi!

also, vielleicht hab ich dich diesmal richtig(er) verstanden. dann fallen mir spontan 3 möglichkeiten ein.

1. du machst aus beidem eine datei und sparst dabei noch ein bissl speicher: du machst einfach ein selbstextrahierendes zip-archiv draus. das tool dafür bekommst du von der winzip-website.

2. du bindest die textdatei als resource mit ein und lässt sie dann beim ausführen des programms extra ausgeben - vielleicht n bissl viel des guten für die aufgabe, weil nicht ganz sooo einfach.

3. du lässt die datei nach obigem verfahren (letzter beitrag meinerseits) einfach bei jedem start des programms in das eigene verzeichnis schreiben. dann gehst du auch gleichzeitig sicher, dass sie, sofern schreibzugriff existiert, wirklich vorhanden ist. dafür dürfte dann auch ne einfache fehlerbehandlung reichen. vorteil gegenüber ner fileexists-abfrage ist, dass du alternativ auch ein standardverzeichnis wie c:\ oder das temp-dir (per systemvariable) für das anlegen der datei angeben kannst, wenn du auf das andere keinen schreibzugriff hast, und somit immernoch mal ne ausweichmöglichkeit hast. bei der ersten und zweiten lösung bliebe dir diese möglichkeit versagt bzw. ließe sich nur umständlich realisieren.

mfg
 
Hallo,
ich hatte mir das eigentlich genau so vorgestellt wie du es in Punkt 2) beschreibst. Wäre das sehr aufwendig? Was brauche ich alles dafür?

Punkt 1) wäre die Alternative falls ich 2) nicht hinkriege, ist aber nicht so geschickt finde ich

Punkt 3) fällt leider weg, da ja dann immer eine leere Datei anlegt wird und ich eine schon bearbeitete öffnen will (will eine Read-me-Datei öffnen)

Also wie funktioniert das denn jetzt genau mit Punkt 2) ?
 
hi,

also, die frage ist zunächst, was du wirklich vorhast. möchtest du eine datei für die ewigkeit (also eine die sich nie ändert) nutzen, oder soll diese nach jeder nutzung wieder in die exe sebst rückgesichert werden?
fall 1: statische textdatei
in diesem fall ist es zwar möglich dateien als *.res in die exe mit einzubinden, aber wirklich sinn macht das schon allein des aufwands wegen nur bei z.b. grafiken. ansonsten würde ich davon abstand nehmen. ein tutorial findest du dazu im netz dutzendweise - einfach googlen.
einfach ist sicher die lösung des schreibens via write.
fall 2: änderungen in der datei sind zur laufzeit normalerweise nicht ohne weiteres möglich. das einfache einfügen in delphi als resource fällt als möglichkeit aus, weil dies zur laufzeit nicht möglich ist. sicher kannst du - vielleicht sogar ohne assembler-kenntnisse - direkt auf die exe zugreifen und in ihr schreiben. damit dir dabei aber die ganze kiste nicht kiloweise errors produziert musst du schon sehr genau wissen, was du tust. das thema würde den rahmen dieses forums sicher deutlich sprengen.
möglich wäre natürlich ne umgehung. es gibt ganz nette kleine freewaretools, die ohne viel aufwand per kommandozeilen-befehl beliebige daten an eine exe anhängen und auch wieder auslesen. du könntest die datei also beim start per batch auslesen und nach dem schließen des programms per batch wieder anhängen lassen. die folge wären aber mindestens vier dateien:
batch für den start
batch nach dem beenden
das programm selbst
das proggy für's anhängen von daten
um also eine zusätzliche datei zu vermeiden drei neue zu schaffen kann man kaum als ökonomisch sinnvoll bezeichnen.

also verweise ich auf lösung 3 aus meinem vorigen posting (wieso eigentlich immer ne leere datei?) oder ganz viel fachliteratur.

mfg

ps: eine leere datei wird nur mit dem befehl rewrite(datei); angelegt. öffnest du die datei wie beschrieben mit append(datei); dann schreibst du immer ans ende der datei. mit dem guten alten seek(); kannst du sogar durch die datei hopsen. und per if fileexists('dateiname') kannst du sogar dafür sorgen, dass eine neue datei nur angelegt wird, falls nicht schon eine existiert.
 
Also erstmal danke für deine Mühe Luzifer84!

Hmm, funktioniert wohl doch nicht so einfach, wie ich mir es vorgestellt habe, muss mal sehen wie ich das jetzt realisiere, entweder so wie du in Punkt 3 beschrieben hast oder ich packe eben einfach alles in ein Archiv.

Naja, damit bin ich sicher noch eine Weile beschäftigt...
 
hi!

damit du nicht ganz so lange bastelst, ein kleines beispiel:

Code:
uses shellapi;
//...
type
         //Ein Array für 100 Zeilen zu je 60 Zeichen - für den Fall, dass du hübsche 
         //Bilder malen willst ;-)
         TZeile = array [1..100] of string[60];
// ...
procedure tform1.clickmich(sender:tbutton);
var datei:textfile;
      Zeile: TZeile;
      i: integer; 
begin
         // datei zuweisen
         assignfile(datei, ExtractFilePath(Paramstr(0)) + 'readme.txt');
         // readme erstellen
         rewrite(datei);
         //         12345678901234567890123456789012345678901234567890
         Zeile[1]:='Dies wird eine Readme für mein Programm xyz!';
         Zeile[2]:='=======================================';
         Zeile[3]:='';
         Zeile[4]:='bei meinem programm xyz handelt es sich um einen virus,';
         Zeile[5]:='der ständig nur müll auf ihrem pc produziert!';
         Zeile[6]:='ich wünsche ihnen viel spaß damit und bitte, ihn nicht';
         Zeile[7]:='mit dem betriebssystem muckelsoft fenster zu verwechseln.';
         Zeile[8]:='mfg - ihr quälgeist';
         //und nun endlich schreiben
         for i := 1 to 100 do
                  writeln(datei,Zeile[i]);
         //schließen nicht vergessen
         closefile(datei);          
         shellexecute(form1.handle,nil,'NOTEPAD.EXE','readme.txt','',1);
         form1.close;
end;

hoffe, dir damit endlich geholfen zu haben. mfg
 
Nochmals danke Luzifer84, du hast mir sehr geholfen :)

Zeile[1]:='Dies wird eine Readme für mein Programm xyz!';
Zeile[2]:='=======================================';
Zeile[3]:='';
Zeile[4]:='bei meinem programm xyz handelt es sich um einen virus,';
Zeile[5]:='der ständig nur müll auf ihrem pc produziert!';
Zeile[6]:='ich wünsche ihnen viel spaß damit und bitte, ihn nicht';
Zeile[7]:='mit dem betriebssystem muckelsoft fenster zu verwechseln.';
Zeile[8]:='mfg - ihr quälgeist';
:D :D
 
Zurück
Oben