Autor |
Beitrag |
spoof
Beiträge: 48
|
Verfasst: 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
Beiträge: 19276
Erhaltene Danke: 1741
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 08.09.13 00:53
Hallo und
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
Beiträge: 48
|
Verfasst: 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:
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; search:string; counter:integer; zeilennr:integer; implementation
{$R *.dfm}
procedure TForm1.BT_filesearchClick(Sender: TObject); begin
if opendialog.Execute then begin ED_File.Text:= opendialog.Filename; loadfile.LoadFromFile(opendialog.Filename); end;
end;
procedure TForm1.BT_CheckClick(Sender: TObject); begin
loadfile:=TStringList.Create; search:=ED_Search.Text; counter:=0;
try loadfile.LoadFromFile(opendialog.Filename);
if pos(search, loadfile.Text) = 0 then begin ShowMessage(search + ' nicht vorhanden!') end else counter:= counter +1;; finally loadfile.Free; LB_Found.caption:=inttostr(counter); end;
end;
procedure TForm1.BT_SaveClick(Sender: TObject); begin
if savedialog.Execute then begin loadfile.SaveToFile(savedialog.Filename); end;
end;
end. |
|
|
jaenicke
Beiträge: 19276
Erhaltene Danke: 1741
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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): 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; end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.BT_filesearchClick(Sender: TObject); begin if OpenDialog.Execute then begin ED_File.Text := OpenDialog.Filename; FLoadedFile.LoadFromFile(OpenDialog.Filename); end; end;
procedure TForm1.BT_CheckClick(Sender: TObject); var SearchText: string; counter: integer; zeilennr: integer; begin SearchText := ED_Search.Text; counter := 0; FLoadedFile.LoadFromFile(OpenDialog.Filename);
if Pos(SearchText, FLoadedFile.Text) = 0 then begin ShowMessage(SearchText + ' nicht vorhanden!') end else counter := counter + 1;; LB_Found.Caption := IntToStr(counter); end;
procedure TForm1.BT_SaveClick(Sender: TObject); begin if SaveDialog.Execute then begin FLoadedFile.SaveToFile(SaveDialog.Filename); end; end;
procedure TForm1.FormCreate(Sender: TObject); begin FLoadedFile := TStringList.Create; end;
procedure TForm1.FormDestroy(Sender: TObject); begin FLoadedFile.Free; end; | (ungetestet)
Für diesen Beitrag haben gedankt: spoof
|
|
spoof
Beiträge: 48
|
Verfasst: 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
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; public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.BT_filesearchClick(Sender: TObject); begin
if opendialog.Execute then begin ED_File.Text:= opendialog.Filename; FLoadedFile.LoadFromFile(OpenDialog.Filename); end;
end;
procedure TForm1.BT_CheckClick(Sender: TObject); var search:string; counter:integer; zeilennr:integer; begin
search:=ED_Search.Text; counter:=0;
try FLoadedFile.LoadFromFile(OpenDialog.Filename);
if pos(search, FLoadedFile.Text) = 0 then begin ShowMessage(search + ' nicht vorhanden!') end else counter:= counter +1;; LB_Found.caption:=inttostr(counter); finally
end;
end;
procedure TForm1.BT_SaveClick(Sender: TObject); begin
if savedialog.Execute then begin FLoadedFile.SaveToFile(SaveDialog.Filename); end;
end;
procedure TForm1.FormCreate(Sender: TObject); begin FLoadedFile := TStringList.Create; end;
procedure TForm1.FormDestroy(Sender: TObject); begin FLoadedFile.Free; end;
end. |
|
|
jaenicke
Beiträge: 19276
Erhaltene Danke: 1741
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
Beiträge: 48
|
Verfasst: 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
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: 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?
Zuletzt bearbeitet von WasWeißDennIch am Di 10.09.13 14:57, insgesamt 1-mal bearbeitet
Für diesen Beitrag haben gedankt: spoof
|
|
spoof
Beiträge: 48
|
Verfasst: Di 10.09.13 13:46
|
|
baumina
Beiträge: 305
Erhaltene Danke: 61
Win 7
Delphi 10.2 Tokyo Enterprise
|
Verfasst: 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
Aber das schrieb jaenicke ja eigentlich schon alles.
Für diesen Beitrag haben gedankt: spoof
|
|
spoof
Beiträge: 48
|
Verfasst: Di 10.09.13 16:20
Ich versteh nich was ihr meint, ich kann dort bei Ereignisse sowas nicht eintragen nur buttons.
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
Beiträge: 305
Erhaltene Danke: 61
Win 7
Delphi 10.2 Tokyo Enterprise
|
Verfasst: 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
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: Di 10.09.13 16:51
Und das E-Book wollen wir auch nicht unterschlagen
Für diesen Beitrag haben gedankt: spoof
|
|
spoof
Beiträge: 48
|
Verfasst: 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
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: 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
Beiträge: 48
|
Verfasst: 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
Beiträge: 632
Erhaltene Danke: 121
Win 7 32-bit
Delphi 2006/XE
|
Verfasst: Di 10.09.13 22:30
spoof hat folgendes geschrieben : | 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
Beiträge: 19276
Erhaltene Danke: 1741
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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.
spoof hat folgendes geschrieben : | 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/
|
|