Autor Beitrag
Thunderwave
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35



BeitragVerfasst: Mo 29.05.06 12:34 
Also: Ich habe ein Programm geschrieben, das eine tabelle als record abspeichert. Der abgespeicherten Datei habe ich einem eigenen dateityp zugewiesen (*.fid). In windows habe ich jetzt eingestellt, das er diesen Dateityp immer mit meinem Programm öffnet. Das problem ist nun, das er zwar mein Programm öffnet, wenn ich auf die datei doppelklicke, aber meine datei nicht im Programm geöffnet wird.
Wie kann ich das machen?
digi_c
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: Mo 29.05.06 12:50 
Der/Die Dateinamen werden dir als Aufrufparameter übergeben. Genauso als wenn du in der Eingabeaufforderung "meinprogramm.exe C:\test.fid" ausführen würdest.

Um an diese ranzukommen benötigst du ParamStr(n) und PramCount. ParamStr(0) enthält aber immer den Pfad zu deinem Programm, also müsstest du mit 1 anfangen.
fidionael
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 232

Win XP SP2, Ubuntu 6.06
Delphi 7 PE, Delphi 3 Prof
BeitragVerfasst: Mo 29.05.06 12:50 
Wenn Windows eine Datei mit deinem Programm öffnen will, startet es einfach dein Programm und übergibt als Parameter den entsprechenden Dateinamen.

Es ist also deine Aufgabe diesen Parameter abzufangen und zu verarbeiten. Parameter auslesen kannst du wie folgt:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var i: Integer;

if ParamCount > 0 then
  for i:=1 to ParamCount do
    case ParamStr(i) of
      '/?': MessageBox(Handle,'Hilfe wurde als Parameter übergeben!',
                       pChar(Caption),MB_ICONINFORMATION);
    end;


Hoffe das hilft dir.

//Edit: Da war user profile icondigi_c wohl schneller ;)
Thunderwave Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35



BeitragVerfasst: Mo 29.05.06 13:07 
ohweih... ich checks net...

also wenn ich das richtig verstanden habe:

wenn ich doppelklick auf die datei mache, dann wird das Programm geöffnet und die parameter der datei werden an das programm gegeben. Und mein problem ist jetzt also das das programm nicht weiß was es mit den parametern anfangen soll. Richtig?

Nun zum code: was muss an die stelle '/?'?

Und wo landet dann mein record?
fidionael
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 232

Win XP SP2, Ubuntu 6.06
Delphi 7 PE, Delphi 3 Prof
BeitragVerfasst: Mo 29.05.06 13:38 
Ich mach es mal mit einer Beispielanwendung. Zur Vereinfachung mit einer Textdatei und ich horche auch nur den ersten Parameter ab, es funktioniert aber mit deinem Record und mehreren Dateien genau so:

ausblenden Delphi-Quelltext
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:
function TForm1.OpenMyFile(Filename: String) : Boolean;
var f: Textfile;
    line: String;
begin
  Result:=True;
  if not FileExists(Filename) then
    Result:=False
  else begin
    AssignFile(f,Filename);
    {$I-} Reset(f); {$I+}
    if ioResult <> 0 then
      Result:=False
    else
      while not eof(f) do begin
        Readln(f,line);
        Memo1.Lines.Add(line);
      end;
    CloseFile(f);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  if ParamCount > 0 then
    if not OpenMyFile(ParamStr(1)) then begin
      MessageBox(Handle,'Es ist ein Fehler beim Öffnen der Datei aufgetreten!',
                 pChar(Caption),MB_ICONERROR);
      Application.Terminate;
    end;
end;
Thunderwave Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35



BeitragVerfasst: Mo 29.05.06 13:52 
das gefällt ihm nicht

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
[Fehler] Unit1.pas(26): Undefinierter Bezeichner: 'OpenMyFile'
[Fehler] Unit1.pas(30): Undefinierter Bezeichner: 'Result'
[Fehler] Unit1.pas(31): Undefinierter Bezeichner: 'Filename'
[Fehler] Unit1.pas(34): Inkompatible Typen
[Fehler] Unit1.pas(51): Undefinierter Bezeichner: 'OpenMyFile'
[Fataler Fehler] Project2.dpr(5): Verwendete Unit 'Unit1.pas' kann nicht compiliert werden


ich will erstmal genau dein programm schreiben, dann kann ichs ja abwandeln, wenn ichs verstanden hab. Ich hab jetzt also ne memo in dem programm, was brauch ich noch?
fidionael
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 232

Win XP SP2, Ubuntu 6.06
Delphi 7 PE, Delphi 3 Prof
BeitragVerfasst: Mo 29.05.06 14:04 
Ich habe in mein Formular an Komponenten nur ein Memo-Feld eingefügt.

Dann habe ich per Hand im Private-Bereich meines Formulars die Funktion OpenMyFile(Filename: String) mit dem Rückgabewert Boolean deklariert:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
type
  TForm1 = class(TForm)
    Memo1: TMemo;
  private
    function OpenMyFile(Filename: String) : Boolean;
  public
    { Public declarations }
  end;


Die Funktion OpenMyFile siehst du dann ja oben.

Dann mache ich im Object Manager meines Formulars einen Doppelklick auf das OnCreate-Event und lasse ihn dort, wenn ein Parameter existiert, die Funktion aufrufen. Gibt die Funktion den Wert False zurück, ist irgendetwas schief gegangen, dann geben wir eine Fehlermeldung raus.

Die Prozedur FormCreate ist oben auch angegeben.

Mfg
Thunderwave Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35



BeitragVerfasst: Mo 29.05.06 14:29 
THX! das funktioniert! es sollte jetzt nicht mehr so schwer sein das auf mein programm anzuwenden...(hoffe ich)^^
Thunderwave Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35



BeitragVerfasst: Mo 29.05.06 15:26 
also an sich funktionierts jetzt super, aber wenn ich nach dem öffnen weiter in den Record schreiben will, kommt eine fehlermeldung. nach längerer untersuchung hab ich dann rausgefunden, das es an der variablen 'f' liegt.
Die frage is nur warum und wie kann ich das ändern?
fidionael
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 232

Win XP SP2, Ubuntu 6.06
Delphi 7 PE, Delphi 3 Prof
BeitragVerfasst: Mo 29.05.06 19:58 
Öhm das ist ein bisschen vage um dir zu helfen, ich würde einfach mal grob mutmaßen, dass du vielleicht f immer noch als Textfile deklariert hast, wenn du deinen Record allerdings als typisierte Datei abgespeichert hast, musst du sie natürlich auch als solche wieder laden

ausblenden Delphi-Quelltext
1:
var f: File of Irgendwas					


Ansonsten hilft es bestimmt, wenn du etwas deiner Source offen legst ;)

//Edit: Das Lesen von typisierten funktioniert natürlich auch nicht via Readln (das ist ja Textfile-spezifisch) sondern dann über Read...