Avatar billede decko Nybegynder
07. august 2003 - 09:52 Der 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;
Avatar billede Slettet bruger
07. august 2003 - 09:58 #1
Hvis det er en memo boks har den en LoadFromFile property:

memo1.Lines.LoadFromFile('\myfile.txt');

Det samme har en RichEdit:

RichEdit1.Lines.LoadFromFile('myfile.rtf');
Avatar billede tauron Nybegynder
07. august 2003 - 10:14 #2
Hvis du vil have programmet til "automatisk" at åbne filen kan du gøre det i en OnFormCreate-event indeholdende de kodesumper, der er vist ovenfor.
Avatar billede decko Nybegynder
07. august 2003 - 10:43 #3
Der hvor du skriver ('\myfile.txt')
skal der vel stå noget andet?
Avatar billede 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);
Avatar billede 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;
Avatar billede 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;

Det virker ved mig.
Avatar billede decko Nybegynder
07. august 2003 - 18:31 #7
Hvis jeg sætter "memo1.Lines.LoadFromFile('\myfile.txt');" ind kommer der følgende: Unknown directive: 'memo1'
Avatar billede decko Nybegynder
09. august 2003 - 22:50 #8
Har i glemt mig???
Avatar billede Slettet bruger
09. august 2003 - 23:41 #9
Er du sikker på din memo hedder memo1??
Avatar billede decko Nybegynder
10. august 2003 - 09:27 #10
Har lige checket!!! Den hedder Memo1!
Avatar billede Slettet bruger
10. august 2003 - 09:41 #11
Kan du ikke poste den procedure som der er fejl i??
Avatar billede decko Nybegynder
10. august 2003 - 10:58 #12
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?
Avatar billede 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;
Avatar billede decko Nybegynder
10. august 2003 - 19:30 #14
Nu er vi tilbage hvor jeg startede. Overstående kode fungere ikke i mit program!!!
Avatar billede Slettet bruger
10. august 2003 - 20:14 #15
Det kunne være du var kommet til at slette System fra uses.
Avatar billede decko Nybegynder
10. august 2003 - 20:56 #16
Mener man SysUtils? Hvis jeg tilføjer system kommer der en Identifier redeclared: 'System'
Avatar billede Slettet bruger
10. august 2003 - 21:53 #17
Ups.. ser ud til den er i uses som standard.
Avatar billede decko Nybegynder
11. august 2003 - 07:09 #18
Skal jeg ikke sætte noget andet ind i ('\myfile.txt');?
Avatar billede tauron Nybegynder
11. august 2003 - 09:33 #19
Her er et fuldstændigt eksempel.

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



unit utestmemo;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

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;

end.
Avatar billede decko Nybegynder
11. august 2003 - 12:31 #20
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.
Avatar billede decko Nybegynder
11. august 2003 - 12:42 #21
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)

end;
Avatar billede tauron Nybegynder
11. august 2003 - 13:33 #22
Jeg har prøvet følgende under XP - og det virker med mit lille testprogram:

1) Dan en tekstfil med den extension, du ønsker skal forbindes med dit program.

2) dobbeltklik på filens ikon i stifinderen.

3) Windows beklager sig sikkert over ikke at vide hvad der skal gøres og giver dig mulighed for at klikke på "vælg program fra en liste'

4) dit program er nok ikke på listen, så du vælger "gennemse" og finder frem til dit program -og hakker af for "brug altid det valgte program ....."

Denne operation danner nogle indgange i Registry - en rigtig nørd går selvfølgelig direkte i registry og græder bag efter
Avatar billede decko Nybegynder
11. august 2003 - 14:56 #23
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!
Avatar billede tauron Nybegynder
11. august 2003 - 15:56 #24
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.
Avatar billede decko Nybegynder
11. august 2003 - 19:31 #25
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.
Avatar billede tauron Nybegynder
11. august 2003 - 20:20 #26
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!
Avatar billede decko Nybegynder
11. august 2003 - 21:35 #27
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!!!
Avatar billede tauron Nybegynder
11. august 2003 - 21:50 #28
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.
Avatar billede stone Forsker
11. august 2003 - 23:22 #29
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;
Avatar billede stone Forsker
11. august 2003 - 23:25 #30
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.
Avatar billede decko Nybegynder
12. august 2003 - 16:02 #31
Jeg har lavet min egen extension.
Avatar billede kaper Nybegynder
25. august 2003 - 14:23 #32
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;
Avatar billede kaper Nybegynder
25. august 2003 - 14:25 #33
ups - glem beskeden "// sParam1 = 'IP'" (hehe) - jeg har brugt koden til at automatisk at oprette en forbindelse til en server, hvis IPen er argument...
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester