Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Dateinamen in Strings speichern
Robii - Sa 30.05.09 20:12
Titel: Dateinamen in Strings speichern
Hey,
in meinem Programm kann man Wegpunkte als "WP"+"EingegebenerName"+".wap" speichern.
Bei Programm-Start, möchte ich, das alle Wegpunkte im Ordner der Programm-Exe gelesen und in Strings gespeichert werden, damit ich sie später anzeigen lassen kann.
Jetzt die Frage, wie kann ich Dateinamen in Strings speichern, ohne zu wissen, wie die Datei heißt, aber ihren AufenthaltsOrt.
Grüße.
Moderiert von
Narses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
Robii - Sa 30.05.09 20:21
Vielen Dank, das hat mir sehr geholfen!
Bleibt nur noch eine Frage, ich möchte jede Datei die gefunden wird ( also den Dateinamen ) einem String zu ordnen, damit ich sie später anzeigen lassen kann. Wie mache ich das ?
Moderiert von
Narses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
Delete - Sa 30.05.09 20:25
Nimm doch einen Nachfahren von TStrings. Ansonsten müsstest Du ja wissen, wieviele Dateien gefunden werden und entsprechend viele Variablen bereitstellen.
Robii - Sa 30.05.09 20:35
Was genau meinst du mit Nachfahren von TStrings? Sorry, kenne mich da nicht gut aus.
Ich weiß nicht wie viele Dateien gefunden werden, da man diese im Programm beliebig häufig erstellen kann.
Moderiert von
Narses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
jaenicke - Sa 30.05.09 20:38
Erstelle eine TStringList und übergib die. Das ist ein Nachfahre von TStrings. Danach hast du darin die Liste von Dateien und kannst diese per Schleife durchgehen.
Regan - Sa 30.05.09 20:39
Wie wäre es mit einer TStringList?
Und: Obwohl das Eingabefeld bei dir sehr klein zu sein scheint, brauchst du nicht, wenn du am Ende bist, einen Zeilenumbruch zu machen. Ich habe ein sehr hohe Auflösung und bei mir ist z. B. bei deinem ersten Post 70% des Bildschirmes leer :wink: .
Edit: Ach mist, zu langsam.
ffgorcky - Sa 30.05.09 20:40
Also ich hätte das ganze jetzt eher mit einer FileListBox gemacht, wo man nur das anzuzeigende Verzeichnis angibt und dann alle darin liegenden Dateien sieht.
Die müsste man dann doch nur noch mit einer For-Schleife durchgehen und sich damit alle merken.
Zum merken könntest Du sie ja zum Beispiel auch in ein Memo schreiben, wenn Dir die FileListBox nicht schon reicht.
Regan - Sa 30.05.09 20:43
ffgorcky hat folgendes geschrieben : |
Also ich hätte das ganze jetzt eher mit einer FileListBox gemacht, wo man nur das anzuzeigende Verzeichnis angibt und dann alle darin liegenden Dateien sieht.
Die müsste man dann doch nur noch mit einer For-Schleife durchgehen und sich damit alle merken. |
Völlig unnötig, hier eine Komponente einzusetzten :motz: . Die macht nur das mehr, was du so und so nicht brauchst.
jaenicke - Sa 30.05.09 20:51
Mal abgesehen davon, dass diese Komponente nicht umsonst unter Win 3.1 steht... Von Windows 3.1 stammt die nämlich, und das ist mittlerweile fast 20 Jahre alt...
Robii - Sa 30.05.09 20:53
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:
| Procedure FindFiles (aPath, aFindMask: String; aWithSub: Boolean; aResult: tStrings); Var FindRec: tSearchRec; Begin
If (aPath = '') or (aFindMask = '') or Not Assigned (aResult) Then Exit;
If aPath[Length (aPath)] <> '\' Then aPath := aPath + '\';
If FindFirst (aPath + aFindMask, faAnyFile, FindRec) = 0 Then Repeat If (FindRec.Name <> '.') and (FindRec.Name <> '..') Then
aResult.Add (aPath + FindRec.Name);
Until FindNext (FindRec) <> 0;
FindClose (FindRec);
If Not aWithSub Then Exit;
If FindFirst (aPath + '*.*', faAnyFile, FindRec) = 0 Then Repeat If (FindRec.Name <> '.') and (FindRec.Name <> '..') Then If Boolean (FindRec.Attr and faDirectory) Then FindFiles (aPath + FindRec.Name, aFindMask, aWithSub, aResult); Until FindNext (FindRec) <> 0;
FindClose (FindRec); End;
procedure TForm1.FormActivate(Sender: TObject); begin AssignFile(Waypoint,WPpath+'WP'+Dateiname[1]+'.wap'); Reset(Waypoint); try ReadLn(Waypoint, WP_XS); WP_XS := copy(WP_XS, pos('=', WP_XS), length(WP_XS)); ReadLn(Waypoint, WP_XS); WP_YS := copy(WP_YS, pos('=', WP_YS), length(WP_YS)); finally CloseFile(Waypoint); DNA[2] := DNA[2]+1; WP_Mar.Left := strtoint(WP_Xs); WP_Mar.Height := strtoint(WP_Ys); end; end; |
Entschuldigt mich, aber irgendwie bin ich grade verwirrt.
Ich erkläre noch mal, was ich genau erreichen möchte.
Also, im Programm kann man Wegpunkte erzeugen. Diese werden in einer .wap Datei abgespeichert unter Folgendem Format:
Name=Name des Wegpunktes
X=X-Koordinate des WPs
Y=Y-Koordinate des WPs
Tooltip=Info zum WP
Beim Start des Programms, soll dieses überprüfen, ob Wegpunkte vorhanden sind. Wenn welche vorhanden sind, soll es alle Infos die es zum WP gibt in Variablen speichern, und diesen erstellen ( X & Y - Koordinate werden benötigt, um die Position des Pfeils festzulegen ).
Der Code oben ist das was ich bis jetzt habe aber nicht funktioniert, weil:
Mal angenommen er findet eine Datei und versucht die X- & Y-Koordinaten zu lesen und in einem Integer zu speichern, er immer versucht X=123 zuspeichern anstatt nur 123. Wieso das?
Ich blicke ebenfalls noch nicht ganz, wie ich das mit den Dateinamen machen soll, bin noch nicht soo lange bei Delphi.
Hoffe auf Hilfe,
Vielen Dank schonmal
und schöne Grüße.
Moderiert von
Gausi: Quote- durch Delphi-Tags ersetzt
Moderiert von
Narses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
jaenicke - Sa 30.05.09 20:56
Was macht das in FormActivate? :shock:
Willst du die Liste wirklich jedesmal aktualisieren, wenn du das Fenster anklickst, nachdem ein anderes Fenster aktiv war?
Sonst nimm lieber OnShow. Das wird wie der Name schon sagt beim Anzeigen ausgelöst.
So ist der Aufruf von FindFiles?
Und für das Auslesen deiner Dateien kannst du ebenfalls wieder eine TStringList nehmen. Da gibts so schöne Sachen wie Values. ;-)
Regan - Sa 30.05.09 20:57
Und benutze bitte beim nächsten Mal [delphi] statt [quote] Tags, danke.
Delete - Sa 30.05.09 20:58
Bei dem Format böte sich TIniFile an, damit geht das einfacher.
Robii - Sa 30.05.09 21:08
Hey,
ich dachte FormActivate ist das, wenn man das Programm startet also quasi aktiviert ? oder nicht?
Leider verstehe ich nicht was ihr meint mit TIniFile ?
Ich kenne mich da wirklich nicht gut aus, wäre euch sehr dankbar, wenn ihr mir einen Beispiel-Code schreibt.
Grüße.
Moderiert von
Narses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
jaenicke - Sa 30.05.09 21:11
Du machst ja schon wieder Zeilenumbrüche... Langsam nervt das...
Robii hat folgendes geschrieben : |
ich dachte FormActivate ist das,
wenn man das Programm startet also
quasi aktiviert ? oder nicht? |
Hast du bei deinem Delphi keine Hilfe?
Zitat: |
Mit OnActivate können Sie bestimmte Operationen durchführen, sobald das Formular den Fokus erhält (wenn es beispielsweise angeklickt wird). |
Robii hat folgendes geschrieben : |
Leider verstehe ich nicht was ihr meint
mit TIniFile ? |
Ich würde eine einfache TStringList nehmen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| var FileContents: TStringList; begin FileContents := TStringList.Create; try FileContents.LoadFromFile... ShowMessage(FileContents.Values['X']); ShowMessage(FileContents.Values['Y']); ... finally FileContents.Free; end; |
Delete - Sa 30.05.09 21:16
Wenn Dir das ganze Casten Spaß macht, bitteschön.
jaenicke - Sa 30.05.09 21:19
Eines der Probleme bei TIniFile ist, dass es (zumindest in Delphi 2006) auf Routinen in Windows aufsetzt, die nur noch zur 16-Bit-Kompatibilität mitgeschleppt werden in der Windows API (steht explizit in der Doku). Und mit einer neuen Windowsversion kann es irgendwann sein, dass die schlicht nicht mehr funktionieren. Insbesondere durch die neue Virtualisierungslösung ab Windows 7...
Robii - Sa 30.05.09 21:24
Also,
erstmal sorry, das ich mich total doof anstelle. Aber habe soetwas noch nie gemacht.
Versuche grade mein Schul-Delphi zuerweitern.
Zuerst muss ich ja die Dateinamen der WPs herrausfinden und abspeichern. Am Besten wäre, wenn ich jeden Dateiname in einen String mit Hilfe von Arrays abspeicher, damit ich selbst nicht die Übersicht verliere.
Wenn das fertig ist, muss ich jede Datei einzelnd öffnen und ihre Werte übertragen.
Kann mir jemand das bitte Schritt für Schritt erklären? Ich versteh kaum etwas von dem was ihr sagt, trotz googeln und suchen von Tutorials.
Grüße & Danke für eure Geduld
Moderiert von
Narses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
jaenicke - Sa 30.05.09 21:30
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| var MyFileList: TStringList; begin MyFileList := TStringList.Create; try FindFiles('c:\...', '*.wap', False, MyFileList); for i := 0 to MyFileList.Count - 1 do begin end; finally MyFileList.Free; end; |
Jetzt versuch aber einmal erst einmal selbst etwas damit... :roll:
Robii - Sa 30.05.09 21:45
Also
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:
| procedure TForm1.FormShow(Sender: TObject); begin var MyFileList: TStringList; begin MyFileList := TStringList.Create; try FindFiles( WPpath,'*.wap', False, MyFileList); for i := 0 to MyFileList.Count - 1 do begin Dateiname[i] := MyFileList[i]; end; finally MyFileList.Free; end; end;
for i:=i++ do begin end
end; |
Habe zwar nicht viel aber etwas verändert.
Dateiname : String;
Nur zum Verständnis für mich: Ich speichere jetzt die Dateinamen der Wegpunte in der Variable Dateiname oder ?
Jetzt muss ich ja "nur" noch die jeweilige Datei öffnen und die Werte, die ich haben will auslesen.
Hoffentlich hab ich das überhaupt richtig verstanden.
Grüße.
Moderiert von
Narses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
jaenicke - Sa 30.05.09 21:47
Robii hat folgendes geschrieben : |
Nur zum Verständnis für mich:
Ich speichere jetzt die Dateinamen der Wegpunte
in der Variable Dateiname oder ? |
Wozu? Du hast den Dateinamen doch in MyFileList[i]. :gruebel:
Das kannst du mit dem vorigen von mir geposteten Quelltext ja direkt kombinieren. Du musst eben statt dem Dateinamen dort nur MyFileList[i] benutzen...
Robii - Sa 30.05.09 21:54
Stimmt ;)
Dann öffne ich jetzt einfach die Datei MyFileList[i] und suche mir meine Daten herraus.
---
Moderiert von
Narses: Beiträge zusammengefasst---
Zitat: |
Stimmt ;)
Dann öffne ich jetzt einfach die Datei MyFileList[i] und suche mir meine Daten herraus. |
Leichter gesagt als getan. Soweit bin ich jetzt gekommen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| MyFileList := TStringList.Create; try FindFiles(WPpath, '*.wap', False, MyFileList); for i := 0 to MyFileList.Count - 1 do begin AssignFile(MyFile, MyFileList[i]);
end; finally MyFileList.Free; end; |
Ich weiß aber nicht, wie ich jetzt genau die Werte aus der Datei lesen, die ich brauche?
Grüße.
Ps.: Aufjedenfall, glaube ich ( was ein Widerspruch ) hat das was mit ReadLn zu tun, oder?
Moderiert von
Narses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
jaenicke - Sa 30.05.09 22:06
Robii hat folgendes geschrieben : |
Ich weiß aber nicht, wie ich jetzt genau die Werte aus der Datei lesen, die ich brauche? |
Wie kommst du denn plötzlich auf AssignFile? :autsch:
Ich habe dir die Lösung doch schon gepostet... :roll:
http://www.delphi-forum.de/viewtopic.php?p=564665#564665
Robii - Sa 30.05.09 22:20
Entschuldige mich mein Meister ;]
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| procedure TForm1.FormShow(Sender: TObject); begin MyFileList := TStringList.Create; try FindFiles(WPpath, '*.wap', False, MyFileList); for i := 0 to MyFileList.Count - 1 do begin FileContents := TStringList.Create; try FileContents.LoadFromFile(MyFileList[i]); X:=FileContents.Values['X']; Y:=FileContents.Values['Y']; finally FileContents.Free; end;
end; finally MyFileList.Free; end; |
Das ist jetzt mein Code.
Aber klappen tut er nicht, hab versucht X in nem EditFeld anzeigen zu lassen. Was ist noch falsch.
Zweifel langsam an mir selbst. Mano.
Grüße & danke für die GEduld
jaenicke - Sa 30.05.09 22:23
Du hast vergessen die Variablen zu deklarieren oder die global deklariert. Zudem sind die Werte in Values Strings.
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:
| procedure TForm1.FormShow(Sender: TObject); var X, Y: Integer; begin MyFileList := TStringList.Create; try FindFiles(WPpath, '*.wap', False, MyFileList); for i := 0 to MyFileList.Count - 1 do begin FileContents := TStringList.Create; try FileContents.LoadFromFile(MyFileList[i]); X := StrToInt(FileContents.Values['X']); Y := StrToInt(FileContents.Values['Y']); EditX.Text := IntToStr(X); finally FileContents.Free; end; end; finally MyFileList.Free; end; |
Robii hat folgendes geschrieben : |
Aber klappen tut er nicht, hab versucht X in nem EditFeld anzeigen zu lassen. Was ist noch falsch. |
Was klappt nicht? Und wo hast du das mit dem Editfeld versucht?
Robii - Sa 30.05.09 22:35
Hatte X & Y als String global deklartiert. Und hab versucht X in einem Edit1.Text anzeigenzulassen.
Wenn ich das dann starte, wird in dem Textfeld einfach nichts angezeigt, startwert des Feldes ist aber 'X-Koordinaten', was darauf schliessen lässt, es zwar geändert wird, die Variable X aber nichts enthält..!
Ps.:
HIer hab ich es versucht:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| procedure TForm1.FormShow(Sender: TObject); begin MyFileList := TStringList.Create; try FindFiles(WPpath, '*.wap', False, MyFileList); for i := 0 to MyFileList.Count - 1 do begin FileContents := TStringList.Create; try FileContents.LoadFromFile(MyFileList[i]); X:=FileContents.Values['X']; Y:=FileContents.Values['Y']; finally FileContents.Free; end;
end; finally MyFileList.Free; end;
Ma_Pos_Mes_Ed.Text := x; |
Moderiert von
Narses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
jaenicke - Sa 30.05.09 22:39
Hast du WPpath denn vorher zugewiesen?
Da musst du dann eben mal einen Haltepunkt setzen und zeilenweise durchgehen und schauen was passiert. Du kannst auch das Projekt (.dpr, .pas, .dfm) anhängen, dann kann ich kurz drüberschauen.
Robii - Sa 30.05.09 22:42
Hab WPpath zugewiesen.
Delphi-Quelltext
1:
| WPpath := ExtractFilePath(Application.Exename); |
Eigentlich müsste es jetzt doch klappen.
Hab einen WP namens WPRobin123.wap im Ordner, wo ich auch das Projekt speichere.
Grüße
Moderiert von
Narses: Delphi-Tags hinzugefügt
jaenicke - Sa 30.05.09 22:52
Statt dein Projekt mal zu posten...
Im Anhang ein Projekt mit exakt dem Quelltext, das funktioniert problemlos. :roll:
Robii - Sa 30.05.09 23:10
Hier Bitte,
1 zu 1 exakt kopiert
Grüße.
Ps: Die Waypoints sind als 'WAP'+Eingegebener NAme+'.wap' definiert.
Grüße.
jaenicke - Sa 30.05.09 23:14
Und was klappt nicht? Mit meiner Testwap-Datei (siehe Testprojekt) klappt das Projekt direkt wie es ist. :nixweiss:
Im Edit erscheint die 100.
Vielleicht haben deine WAP-Dateien doch nicht das angegebene Format? Vergleiche einmal...
Robii - Sa 30.05.09 23:16
Wirklich verstehen tu ich es nicht. Aber ich habe den Code aus deinem Beispiel genommen, ihn eingefügt und siehe da, es klappt.
Vielen Dank.
Jetzt ist mir einiges klarer geworden.
Eine Frage hätte ich noch. Wie kann ich per Befehl ein Bild erstellen? Also, das ich wenn ich dann x & Y koordinaten erstellt habe, ich ein Bild an diesem Punkt erstelle?
Grüße.
Moderiert von
Narses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
jaenicke - Sa 30.05.09 23:25
Das kommt ja drauf an wie du es machen willst. Entweder sauber mit einer TPaintBox, die dann in OnPaint die Anzeige übernimmt, was aber schon ein wenig komplizierter ist.
Oder einfach indem du jeweils ein TImage erzeugst, an die richtige Position setzt und das Bild hineinlegst.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var MyImage: TImage; begin MyImage := TImage.Create(Self); MyImage.Parent := Self; MyImage.Left := X; MyImage.Top := Y; MyImage.Height := ... MyImage.LoadFromFile... ... |
Zudem: Neue Frage --> neues Thema
Robii - Sa 30.05.09 23:26
Letzeres war genau das, was ich erwartet hatte.
Danke. Fals neue Probleme entstehen melde ich mich nochmal.
Vielen Dank !!
---
Moderiert von
Narses: Beiträge zusammengefasst---
Gleich eine Frage,
wenn ich in einem Frame mit einer Boolean-Variable arbeite, die ich auch in meinem Hautprogramm benutzte, wie kann ich sie für beide verfügbar machen?
Grüße.
Moderiert von
Narses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
jaenicke - Sa 30.05.09 23:52
Du solltest das als Feld oder Eigenschaft deklarieren, dann kannst du vom anderen Formular aus drauf zugreifen.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| TForm2 = class... ... public MyField: Boolean; end;
... Form2.MyField := True; Form2.Show; ... |
Meinst du ein Formular, einen Frame oder noch etwas anderes? :mrgreen:
Und dass weitere Fragen nicht in den selben Thread gehören, weißt du doch... :roll:
Robii - Sa 30.05.09 23:55
E.:/ Hat sich geklärt.
Vielen Dank für die Geduld und die Erklärungen!
Jetzt bin ich wieder um Einiges schlauer!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!