07. august 2003 - 09:52Der er
30 kommentarer og 3 løsninger
Åbn filer
Jeg er i gang med en teksteditor. Men jeg mangler lige lidt. Hvis jeg prøver at åbne filen ved at dobbletklikke på den, åbner den mit program. Ikke filen!? Jeg har prøvet at sætte denne kode ind på formens OnCreate men det virkede ikke!:
if ParamStr(1) <> '' then begin filnavn := ParamStr(1); // Kode til at loade filnavn ind i memo, richedit etc... end;
Der hvor du skriver ('\myfile.txt') skal der vel stå noget andet?
Synes godt om
Slettet bruger
07. august 2003 - 10:50#4
'myfile.txt' er blot et eksempel på et filnavn. Her skal du indsætte den variabel med filnavnet som du ønsker at åbne.
Du kan bruge komponenten TOpenDialog (ligger under Dialogs) til at åbne filer med. Du bruger den således:
if opendialog1.Execute then memo1.Lines.LoadFromFile(opendialog1.FileName);
Synes godt om
Slettet bruger
07. august 2003 - 10:58#5
Hvis du vil associere et bestemt filnavn med din applikation er det en lidt anden sag. Der skal du ændre i Microsoft's registreringsdatabase. Der findes sikkert en masse værktøjer til dette. Du kan også lave et Drag&Drop event til din applikation:
På din FormCreate ligger du denne kode:
TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } procedure AcceptFiles( var msg : TMessage ); message WM_DROPFILES; end;
Proceduren AcceptFiles ser således ud:
uses ShellApi;
procedure TForm1.AcceptFiles( var msg : TMessage ); const cnMaxFileNameLen = 255; var i, nCount : integer; acFileName : array [0..cnMaxFileNameLen] of char; begin // Find number of dragged files nCount := DragQueryFile( msg.WParam, $FFFFFFFF, acFileName, cnMaxFileNameLen ); // Handle each file seperately for i := 0 to nCount-1 do begin DragQueryFile( msg.WParam, i, acFileName, cnMaxFileNameLen ); // Insert your code here // To handle the dragged file // For example a function to open the dragged // file. memo1.Lines.LoadFromFile(acFileName); end; DragFinish( msg.WParam ); end;
Synes godt om
Slettet bruger
07. august 2003 - 14:40#6
procedure TForm1.FormCreate(Sender: TObject); var filnavn:String; begin if ParamStr(1) <> '' then begin filnavn := ParamStr(1); Memo1.Lines.LoadFromFile(filnavn); end; end;
Efter jeg har fået Delphi 7 ser det bedre ud! Her er proceduren:
procedure TForm1.FormCreate(Sender: TObject); begin memo1.Lines.LoadFromFile('\myfile.txt'); end;
Den kan ikke åbne myfile.txt. Jeg ved myfile.txt bare er et eksempel. Men jeg forstår ikke hvad der skal stå istedet for?
Synes godt om
Slettet bruger
10. august 2003 - 18:22#13
Den kan ikke åbne myfile.txt fordi den ikke findes :)... prøv at bruge det her istedet:
procedure TForm1.FormCreate(Sender: TObject); var filnavn:String; begin if ParamStr(1) <> '' then begin filnavn := ParamStr(1); Memo1.Lines.LoadFromFile(filnavn); end; end;
Programmet åbner en open-dialogboks hvis der mangler en programparameter. Bemærk kaldet af opendialog1's .execute metode - hvis man klikker "annuler" får execute resultatet false og man har ikke et gyldigt resultat i filename. For fuldstændighedens skyld skrives filnavnet i en editboks.
Her er dpr-filen, dfm-filen som tekst og pas-filen
program testmemo;
uses Forms, utestmemo in 'utestmemo.pas' {Form1};
{$R *.res}
begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end.
object Form1: TForm1 Left = 350 Top = 174 Width = 433 Height = 493 Caption = 'Form1' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False OnCreate = FormCreate PixelsPerInch = 96 TextHeight = 13 object Memo1: TMemo Left = 24 Top = 48 Width = 385 Height = 401 Lines.Strings = ( 'Memo1') TabOrder = 0 end object filnavnbox: TEdit Left = 24 Top = 16 Width = 385 Height = 21 TabOrder = 1 Text = 'filnavnbox' end object OpenDialog1: TOpenDialog Left = 240 Top = 200 end end
type TForm1 = class(TForm) Memo1: TMemo; filnavnbox: TEdit; OpenDialog1: TOpenDialog; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); var fn: string; begin fn := paramstr(1); if fn='' then with opendialog1 do if execute then fn := filename; filnavnbox.text := fn; if not fileexists(fn) then showmessage('du er en klovn') else memo1.Lines.loadfromfile(fn); end;
Flot nok tauron!!! Men mit program skal jo ikke åbne en opendialog når man dobbelt-klikker på selve dokumentet i dens mappe. Altså når programmet ikke kører.
Det kunne måske hjælpe at se min Gem & gem som-funktion.(rettet har intet med koden at gøre):
Gem Som:
procedure TForm1.GemSom2Click(Sender: TObject); begin SaveDialog1.FileName := PathName; if SaveDialog1.Execute then begin PathName := SaveDialog1.FileName; Caption := ExtractFileName(PathName);
end; rettet:= false end;
Gem-funktion:
procedure TForm1.SpeedButton3Click(Sender: TObject); begin if filnavn = '' then begin savedialog1.execute; filnavn := savedialog1.filename; end; if filnavn = '' then else Memo1.Lines.SaveToFile (filnavn)
Jo, det virker også. Men hvis man så vil åbne programmet for at lave et nyt dokument, åbner den en opendialog som man så skal trykke annuller til for at skrive et nyt dokument!
Det kan selvfølgelig også klares - du skal blot erstatte mit showmessage forslag med en høflig anmodning om at taste et filnavn. Delphi har flere nyttige rutiner til formålet - se Delphis Help under "Dialog and Message Routines". Man kan faktisk få megen inspiration og slippe for kluntet programmering ved at gå lidt på opdagelse i Delphis help.
Så skal man jo først lave en fil for at gå ind i programmet for at slette hvad der står i filen hvorefter man så kan gemme en ny fil og så begynde at skrive. Det må da kunne gøres på en måde hvor man bare dobbelt-klikker på filen så bliver den åbnet. Og når man åbner programmet kan man skrive med det samme. Lige som notepad.
Du kan jo ikke dobbeltklikke på en ikke-eksisterende fil! Så hvis du vil danne en fil fra ny, må du kalde selve programmet. Men du kan jo tilføje en knap "ny fil", der udfører memo1.lines.clear.
Hvis du i open-dialogen klikker annuller og svarer OK til "du er en klovn" (du kan jo bruge en mere høflig vending hvis du synes) står du med en blank editor og kan begynde at skrive. Du skal nok lige først kalde memo1.lines.clear for at være helt sikker på at der ikke er snavs i editoren.
Når du forlader editoren kan du teste på memo1.modified for at se om der er sket ændringer.
Nu vil jeg ikke lave hele programmet for dig - så du må selv tilføje din savedialog- kommunikation.
Bare klø på! Delphi er fuld af udfordringer og elegante løsninger!
Jeg ved ikke om du forstår hvad jeg mener. Lad mig forklare det sådan: Nu bruger jeg notepad som eksempel. Hvis man åbner notepad kommer der et blankt dokument frem. Hvis man så tager og skriver noget f.eks "hejsa" kan man så tage at gemme det (sjovt nok) som hejsa.txt. Hvis man så går ud af programmet. Finder hejsa.txt i f.eks stifinder, kan man dobbeltklikke på hejsa.txt. Så åbner notepad og hejsa.txt bliver loaded ind i notepad. Det er sådan jeg vil have mit program til at virke!!!
Mit programeksempel + de efterfølgende windows/stifinder manøvrer for at få ekstensin knytet til programmet gør det netop muligt at dobbeltklikke på en fil og få den indlæst i editoren. Men hvis du vil lave en ny fil kan du jo ikke dobbeltklikke på den før den er dannet. Du må så enten kalde programmet selv eller dobbeltklikke på en tilfældig fil og sige annuller i open-dialogen.
Mit eksempel indeholder ikke "gem" og "gem som" fordi jeg opfattede dit problem som primært det med dobbeltklikket i stifinderen.
Hvis du ønsker programmet skal checke om din text fil eksistere, hvis den ikke eksistere creater den f.eks test.txt procedure THistory1.FormCreate(Sender: TObject); var t : tstringlist; begin t := tstringlist.create; if not fileexists('test.txt') then t.savetofile('test.txt') else t.loadfromfile('test.txt'); FreeAndNil(t); end;
Gem og Hent: procedure THistory1.FormClose(Sender: TObject; var Action: TCloseAction); begin History.lines.savetofile('test.txt'); end;
procedure THistory1.FormActivate(Sender: TObject); begin History.lines.loadfromfile('test.txt'); end;
for at acocierer en fil er du nød til at lave din egen extention - da brugeren af dit program helt sikkert ikke ønsker at alle txt filer åbnes i dit program.
Det ligner nu det, du selv har skrevet, men dette er testet og virker fint: procedure TForm1.FormCreate(Sender: TObject); var sParam1: String; begin sParam1 := ParamStr(1); // sParam1 = 'IP' if sParam1 <> '' then memo1.Lines.LoadFromFile(sParam1); end;
ups - glem beskeden "// sParam1 = 'IP'" (hehe) - jeg har brugt koden til at automatisk at oprette en forbindelse til en server, hvis IPen er argument...
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.