Entwickler-Ecke

Dateizugriff - Auf Datei zugreifen, nach etwas suchen, datei speichern


spoof - Sa 07.09.13 21:47
Titel: Auf Datei zugreifen, nach etwas suchen, datei speichern
Hallo, ich lerne momentan in der Schule Delphi, allerdings geht das dort alles sehr langsam voran.
Jetzt bin ich dabei privat ein wenig mehr daraus zu machen und versuche gerade ein Programm zu schreiben, wo ich allerdings nicht weiter komme da ich einige Dinge noch nicht kenne und im Internet finde ich weder Tutorials die mir weiter helfen noch Foren die die Fragen beantworten.

Ich muss bei meinem Programm zu aller erst eine Textdatei einlesen lassen, das wollte ich gern über ein Edit Feld machen, sodas der Anwender auf das Edit Feld klickt und wie man es kennt sich das Feld öffnet wo er seine txt datei auswählen kann. Im Edit Feld wird dann der Pfad sichtbar. Ich dachte ich kann das ganz einfach machen indem ich ein opentextfiledialog auf mein Edit Feld ziehe, aber in Delphi (Embacadero) scheint das wohl nicht der fall zu sein. Wie ist es möglich sowas zu machen?

Nach dem einlesen soll innerhalb der Datei nach einem Suchbegriff gesucht werden welcher in einem weiteren Edit Feld eingegeben werden kann.

Es gibt 2 Button, der eine sagt dem Anwender wie oft der Suchbegriff gefunden wurde und der andere Button soll ein Speicher Button sein welcher ebenfalls das bekannte Fenster öffnet welches einen Pfad auswählen lässt wo man eine Datei speichern kann mit den gefundenen zeilennummern(wo ich dachte es wäre mit einem savetextdialog machbar)

Kann mir bitte jemand weiterhelfen?

mfg


jaenicke - So 08.09.13 00:53

Hallo und :welcome:

Ein paar Stichpunkte:


spoof - So 08.09.13 11:37

Danke erstmal, allerdings hab ich dabei noch ziemliche Probleme, ich hab jetzt mal versucht eine einlese zu machen mit button 1 wo die datei ausgewählt werden kann und der inhalt in eine variable gespeichert werden soll, mit dem 2 button soll dann nach einem suchbegriff geprüft werden und in der variablen counter immer +1 gemacht werden wenn der begriff gefunden wird und das label counter soll dann anzeigen wie oft der begriff in der datei vorkommt. Mit button 3 sollen alle gefundenen zeilen in der der suchbegriff vorkam dann in eine neue datei gespeichert werden.
Das ist mein aktueller code, bisher soll es eingelesen und gecheckt werden aber irgendwie funktioniert das nicht:






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:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
var
  Form1: TForm1;
  loadfile:TStringList;    //loaded file
  search:string;           //search string
  counter:integer;         //number of founds
  zeilennr:integer;        //line number

implementation

{$R *.dfm}

procedure TForm1.BT_filesearchClick(Sender: TObject);    //load
begin

if opendialog.Execute then       //fileload
      begin
      ED_File.Text:= opendialog.Filename;
      loadfile.LoadFromFile(opendialog.Filename);
      end;

end;


procedure TForm1.BT_CheckClick(Sender: TObject);     //counter check
begin

  loadfile:=TStringList.Create;           //loaded file
  search:=ED_Search.Text;                 //search string
  counter:=0;                             //number of founds


     try                                                  //check number of founds
     loadfile.LoadFromFile(opendialog.Filename);

     if pos(search, loadfile.Text) = 0 then
       begin
       ShowMessage(search + ' nicht vorhanden!')          //nothing found
       end
     else
       counter:= counter +1;;                          //counter +1 for every search found

     finally
       loadfile.Free;
       LB_Found.caption:=inttostr(counter);              //number of founds output
     end;

  end;



procedure TForm1.BT_SaveClick(Sender: TObject);    //save
begin

if savedialog.Execute then       //filesave
      begin
      loadfile.SaveToFile(savedialog.Filename);
      end;

end;



end.


jaenicke - So 08.09.13 13:25

Du hast leider vergessen zu schreiben was im Moment das Problem ist. Ich vermute mal eine Exception mit Zugriff auf Adresse 0?

Erstens solltest du die Variablen besser wie schon geschrieben unter private unterbringen. Globale Variablen sollte man nur im äußersten Notfall einsetzen. Zumal du search, counter und zeilennr nur lokal verwendest, dann kannst du die auch in BT_filesearchClick deklarieren. Das macht es übersichtlicher.

Und zweitens erzeugst du loadfile erst in BT_CheckClick, obwohl du es beim Auswählen der Datei in BT_filesearchClick bereits verwendest. Du könntest es in OnCreate deines Formulars erzeugen und in OnDestroy freigeben.

Mein Vorschlag (FormCreate und FormDestroy musst du natürlich den Ereignissen OnCreate und OnDestroy des Formulars zuweisen):

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:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
type
  TForm1 = class(TForm)
    // ...
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    FLoadedFile: TStringList; // loaded file
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BT_filesearchClick(Sender: TObject); // load
begin
  if OpenDialog.Execute then // fileload
  begin
    ED_File.Text := OpenDialog.Filename;
    FLoadedFile.LoadFromFile(OpenDialog.Filename);
  end;
end;

procedure TForm1.BT_CheckClick(Sender: TObject); // counter check
var
  SearchText: string// search string
  counter: integer; // number of founds
  zeilennr: integer; // line number
begin
  SearchText := ED_Search.Text; // search string
  counter := 0// number of founds

  FLoadedFile.LoadFromFile(OpenDialog.Filename);

  if Pos(SearchText, FLoadedFile.Text) = 0 then
  begin
    ShowMessage(SearchText + ' nicht vorhanden!'// nothing found
  end
  else
    counter := counter + 1;; // counter +1 for every search found

  LB_Found.Caption := IntToStr(counter); // number of founds output
end;

procedure TForm1.BT_SaveClick(Sender: TObject); // save
begin
  if SaveDialog.Execute then // filesave
  begin
    FLoadedFile.SaveToFile(SaveDialog.Filename);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FLoadedFile := TStringList.Create; // loaded file
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FLoadedFile.Free;
end;
(ungetestet)


spoof - So 08.09.13 23:16

Ich hab das ganze mal übernommen wie du es geschrieben hast, bekomme aber diesen fehler bei dem einlesen der textdatei
user defined image


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:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
type
  TForm1 = class(TForm)
    BT_Check: TButton;
    BT_Save: TButton;
    LB_File: TLabel;
    LB_Search: TLabel;
    ED_Search: TEdit;
    ED_File: TEdit;
    LB_Found: TLabel;
    LB_Accounts: TLabel;
    BT_filesearch: TButton;
    SaveDialog: TSaveDialog;
    OpenDialog: TOpenDialog;
    procedure BT_CheckClick(Sender: TObject);
    procedure BT_filesearchClick(Sender: TObject);
    procedure BT_SaveClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);

  private
  FLoadedFile: TStringList; // loaded file
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;


implementation

{$R *.dfm}

procedure TForm1.BT_filesearchClick(Sender: TObject);    //load
begin

if opendialog.Execute then       //fileload
      begin
      ED_File.Text:= opendialog.Filename;
      FLoadedFile.LoadFromFile(OpenDialog.Filename);
      end;

end;


procedure TForm1.BT_CheckClick(Sender: TObject);     //counter check
var
  search:string;           //search string
  counter:integer;         //number of founds
  zeilennr:integer;        //line number
begin


  search:=ED_Search.Text;                 //search string
  counter:=0;                             //number of founds


     try                                                  //check number of founds
     FLoadedFile.LoadFromFile(OpenDialog.Filename);

     if pos(search, FLoadedFile.Text) = 0 then
       begin
       ShowMessage(search + ' nicht vorhanden!')          //nothing found
       end
     else
       counter:= counter +1;;                          //counter +1 for every search found
        LB_Found.caption:=inttostr(counter);              //number of founds output
     finally


     end;

  end;



procedure TForm1.BT_SaveClick(Sender: TObject);    //save
begin

if savedialog.Execute then       //filesave
      begin
      FLoadedFile.SaveToFile(SaveDialog.Filename);
      end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FLoadedFile := TStringList.Create; // loaded file
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FLoadedFile.Free;
end;


end.


jaenicke - Mo 09.09.13 07:19

Bist du dir sicher, dass das FormCreate bei OnCreate des Formulars zugewiesen ist? Setz doch einfach mal dprt einen Haltepunkt und schau, ob das Programm dort ankommt.
Genauso kannst du auch einen Haltepunkt in deiner Prüfroutine setzen und debuggen wo der Fehler passiert, sprich mit F8 schrittweise durchgehen.


spoof - Mo 09.09.13 18:10

Also er makiert im Code diese Zeile

Delphi-Quelltext
1:
 FLoadedFile.LoadFromFile(OpenDialog.Filename);                    


rot sprich das ist die Zeile die den Fehler verursacht aber wieso kp


WasWeißDennIch - Mo 09.09.13 18:58

Hast Du die Stringliste denn auch erzeugt? Sieh Dir nochmal das OnCreate da oben im Beispielcode an, da wird die Instanz angelegt. Oder um ganz sicherzugehen:

Delphi-Quelltext
1:
2:
3:
4:
if not Assigned(FLoadedFile) then
  ShowMessage('Huch, die Liste gibt es ja noch gar nicht :(')
else
  FLoadedFile.LoadFromFile(OpenDialog.Filename);

Was passiert nun?


spoof - Di 10.09.13 13:46

die showmessage geht auf


baumina - Di 10.09.13 13:59

Doppelklick im Objektinspektor des Formulars bei Ereignisse : OnCreate. Dort müsste dann folgendes rein kommen:


Delphi-Quelltext
1:
FLoadedFile := TStringList.Create;                    


Im OnDestroy dann:


Delphi-Quelltext
1:
FLoadedFile.Free;                    


Aber das schrieb jaenicke ja eigentlich schon alles.


spoof - Di 10.09.13 16:20

Ich versteh nich was ihr meint, ich kann dort bei Ereignisse sowas nicht eintragen nur buttons.




user defined image



Ich versteh auch nich ganz was das ganze überhaupt macht, ich hab noch nie mit diesen Dingen (oncreate destroy private deklaration und TStringList) gearbeitet.
So wie ich das verstehe soll bei TForm1.FormCreate also wenn das formular geöffnet wird bzw erstellt, die variable erstellt werden FLoadedFile := TStringList.Create; Wofür das .create steht versteh ich nich ganz bei der variablen und was tstringlist anderes macht als ein string auch nicht.
Dann warum private
FLoadedFile: TStringList; // loaded file
{ Private-Deklarationen }
man das oben nochmal in privat deklariert versteh ich ebenso wenig und
procedure TForm1.FormDestroy(Sender: TObject);
begin
FLoadedFile.Free;
end;
dort wird beim schließen des programmes die variable frei gegeben was ich auch nich verstehe oO


baumina - Di 10.09.13 16:36

Hm, eventuell ist eine TStringList, welches eine Liste aus Strings und keine Variable ist, doch schon zu weit gegriffen. Ich kann dir hier leider das Programmieren nicht in ein paar Zeilen beibringen. Solltest Du dich für Listen interessieren, gäbe es hier ein Tutorial : http://www.delphi-treff.de/tutorials/vcl/listen-in-delphi/einfuehrung/


WasWeißDennIch - Di 10.09.13 16:51

Und das E-Book [http://www.delphi-treff.de/downloads/e-book/] wollen wir auch nicht unterschlagen ;)


spoof - Di 10.09.13 17:24

Kann mir jemand den unterschied zwischen string und stringlist erklären, ich seh da keinen unterschied, sowohl in einem string als auch einer stringlist kann ich theoretisch meine txt speicher.

Btw ein kollege hat das programm ebenfalls geschrieben allerdings mit memos wo er die liste rein geladen hat und dadurch von einer zur anderen memo bearbeitet hat und dann ausgegeben hat, die memos hat er versteckt^^ sicher nicht das beste aber es ging, worauf ich hinaus will er hat es mit einer liste probiert die 800k zeilen hatte da hat das programm schlapp gemacht, ich denke mal da alles in die memo geladen wurde und das zu viel war wird ein string sowas schaffen? Bei mir soll der inhalt im programm ja nicht dargestellt werden wie es bei ihm wurde.


WasWeißDennIch - Di 10.09.13 17:40

Ein String ist eine Zeichenkette und eine Stringlist eine Liste solcher Zeichenketten. Da Letztere eine Klasse ist, muss man sie aber erst instanzieren (= erzeugen), bevor man sie benutzen kann. Das war jetzt stark vereinfacht, aber zuviel Detailwissen würde IMO derzeit nur für noch mehr Verwirrung sorgen. Übrigens müsste das in der Hilfe ganz gut beschrieben sein, man kann aber zur Not auch hier recherchieren: [url]http://www.delphipraxis.net/dp_reference.php[/url]


spoof - Di 10.09.13 20:37

Ich versteh nich wieso es im Intenet nix vernünftiges gibt um delphi zu lernen, ich hab mich eine Zeit lang mit java beschäftigt und da gibt es so geile Tutorials zb Brotcrunsher auf Youtube http://www.youtube.com/playlist?list=PL71C6DFDDF73835C2 96 aufeinander aufbauende Video Tutorials, in denen er auch immer Hausaufgaben aufgibt die im folgevideo "besprochen" werden. Also richtig wie in der Schule man lernt etwas in Video a hat am Ende des Videos eine Aufgabe und nachdem man diese gemacht hat schaut man Video b, überprüft es und bekommt dann wieder was neues beigebracht.
Bei delphi find ich nur stumpfe theorie tutorials. Ich weiß was arrays sind schleifen usw aber all das kann ich 0 in delphi anwenden weil ich nichts hab woran ich das üben könnte.


Gerd Kayser - Di 10.09.13 22:30

user profile iconspoof hat folgendes geschrieben Zum zitierten Posting springen:
Ich weiß was arrays sind schleifen usw aber all das kann ich 0 in delphi anwenden weil ich nichts hab woran ich das üben könnte.

Schau Dir das einmal an:
http://www.delphibasics.co.uk/index.html
http://www.delphibasics.co.uk/RTL.asp?Name=TStringList

Sind zwar keine Videos, aber mit Beispielen gut erklärt.


jaenicke - Di 10.09.13 22:30

Von Videos zum Lernen einer Programmiersprache halte ich absolut nichts. Ich habe Delphi damals zumindest anfangs mit einer Handvoll Büchern, der mitgelieferten Hilfe und viel probieren gelernt...
Man muss sich aber auch wirklich dransetzen und nicht gleich wieder aufgeben.

user profile iconspoof hat folgendes geschrieben Zum zitierten Posting springen:
Ich weiß was arrays sind schleifen usw aber all das kann ich 0 in delphi anwenden weil ich nichts hab woran ich das üben könnte.
Dann schau dir am besten noch an was Klassen sind und wie man sie benutzt, das fehlt dir nämlich gerade. ;-)
http://www.delphi-treff.de/object-pascal/klassen-und-objekte/