Autor Beitrag
spoof
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48



BeitragVerfasst: Sa 07.09.13 21:47 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 08.09.13 00:53 
Hallo und :welcome:

Ein paar Stichpunkte:
  • Der Dialog ist schon gut, aber aufrufen musst du den schon selbst im Ereignis OnClick eines Buttons oder des Editfelds z.B., denn woher sollte Delphi denn wissen, dass das genau dort passieren soll? Das geht mit der Methode Execute des Dialogs.
  • Die Datei kannst du dann in eine TStringList laden, die du als Feld unter private deklarieren kannst. Die Stringliste hat die Methode LoadFromFile.
  • In dem Inhalt dieser Stringliste kannst du dann suchen, ändern, ...
  • Mit SaveToFile der Stringliste kannst du diese auch wieder speichern.

Für diesen Beitrag haben gedankt: spoof
spoof Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48



BeitragVerfasst: 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:





ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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):
ausblenden volle Höhe 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)

Für diesen Beitrag haben gedankt: spoof
spoof Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48



BeitragVerfasst: 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

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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.

Für diesen Beitrag haben gedankt: spoof
spoof Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48



BeitragVerfasst: Mo 09.09.13 18:10 
Also er makiert im Code diese Zeile
ausblenden Delphi-Quelltext
1:
 FLoadedFile.LoadFromFile(OpenDialog.Filename);					


rot sprich das ist die Zeile die den Fehler verursacht aber wieso kp
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: 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:
ausblenden 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?


Zuletzt bearbeitet von WasWeißDennIch am Di 10.09.13 14:57, insgesamt 1-mal bearbeitet

Für diesen Beitrag haben gedankt: spoof
spoof Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48



BeitragVerfasst: Di 10.09.13 13:46 
die showmessage geht auf
baumina
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 305
Erhaltene Danke: 61

Win 7
Delphi 10.2 Tokyo Enterprise
BeitragVerfasst: Di 10.09.13 13:59 
Doppelklick im Objektinspektor des Formulars bei Ereignisse : OnCreate. Dort müsste dann folgendes rein kommen:

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


Im OnDestroy dann:

ausblenden Delphi-Quelltext
1:
FLoadedFile.Free;					


Aber das schrieb jaenicke ja eigentlich schon alles.

Für diesen Beitrag haben gedankt: spoof
spoof Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 305
Erhaltene Danke: 61

Win 7
Delphi 10.2 Tokyo Enterprise
BeitragVerfasst: 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 : www.delphi-treff.de/...-delphi/einfuehrung/

Für diesen Beitrag haben gedankt: spoof
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Di 10.09.13 16:51 
Und das E-Book wollen wir auch nicht unterschlagen ;)

Für diesen Beitrag haben gedankt: spoof
spoof Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: 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]www.delphipraxis.net..._reference.php[/url]
spoof Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48



BeitragVerfasst: 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 www.youtube.com/play...t=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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: 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:
www.delphibasics.co.uk/index.html
www.delphibasics.co....asp?Name=TStringList

Sind zwar keine Videos, aber mit Beispielen gut erklärt.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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. ;-)
www.delphi-treff.de/...klassen-und-objekte/