Entwickler-Ecke
Dateizugriff - Löschen von Datensätzen in einer Datei
daywalker0086 - Do 29.12.05 18:39
Titel: Löschen von Datensätzen in einer Datei
Hallo, hab ein problem, ich habe ein Paar Editfelder und eine html Datei, in die Daten aus den Editfelder so hineingeschrieben werden:
Quelltext
1:
| SLAlkoven.Add('<tr> <td width="400">'+DBMemo1.Text+'<hr></td> <td valign="top"><span style="font-family:''Times New Roman'',Times,serif; font-weight:bold; font-size:12pt">'+EBezeichnung.Text+'</span><br><br>'+'<img src="data/images/gebrauchte/'+EBild.Text+'.jpg"></td></tr>'); |
Meine Frage:
Wie kann ich jetzt diese Daten wieder aus der Datei löschen? Die EIngabemaske sozusagen ist ja immer die gleiche, also wenn die Daten der einzelnen Felder mit einem Datensatz in der Datei übereinstimmen, soll der Der Datensatz in der Datei koplett mit den html Tags gelöscht werden. Die kann ich das nun machen?
Mit
Quelltext
1:
| SLAlkoven.Delete('<tr> <td width="400">'+DBMemo1.Text+'<hr></td> <td valign="top"><span style="font-family:''Times New Roman'',Times,serif; font-weight:bold; font-size:12pt">'+EBezeichnung.Text+'</span><br><br>'+'<img src="data/images/gebrauchte/'+EBild.Text+'.jpg"></td></tr>'); |
geht es nicht, da kommt dann immer Incompatible types: Integer and String.
Das ist ja auch verständlich nur wie kann ichs jetzt machen das es funktioniert?
Für Hilfe wäre ich sehr dankbar, komm da nicht weiter.
stifflersmom - Do 29.12.05 18:53
Uups, so'n Mist, meine Glaskugel ist gerade zerbrochen :-)
Aber mal im ernst:
Poste doch mal mehr von Deinem Code und beschreibe mal etwas verständlicher,
was Du GENAU willst.
Sonst fallen mir im Momement nur solche Schlagworte wie
StringReplace oder Pos ein.
Moin
daywalker0086 - Do 29.12.05 19:24
Also ich habe Edirfelder, 4 Stück, dann habe ich eine Stringliste, in die ich die Daten der Editfelder hineinschreiben lasse:
Quelltext
1: 2:
| SLAlkoven := TStringList.Create; alkoven:= 'E:\Programme\Borland\Delphi7\Projects\alkoven.txt'; |
Wenn ich auf einen Button klicke dnn macht er folgendes:
Quelltext
1: 2: 3: 4:
| SLAlkoven.LoadFromFile(alkoven); SLAlkoven.Add('<tr> <td width="400">'+DBMemo1.Text+'<hr></td> <td valign="top"><span style="font-family:''Times New Roman'',Times,serif; font-weight:bold; font-size:12pt">'+EBezeichnung.Text+'</span><br><br>'+'<img src="data/images/gebrauchte/'+EBild.Text+'.jpg"></td></tr>'); SLAlkoven.SaveToFile(alkoven); |
Jetzt stehen meine Eingaben von den Editfeldern mit html Code in der Datei alkoven.txt
Das Problem:
Wenn ich jetzt das gleiche in meine Editfelder eingebe, soll wenn ich auf meinen "löschen" Button drücke dieserDatensatz, der ja dann schon in der Datei vorhanden ist gelöscht werden, wie mach ich das nun, ich hoffe ich konnte mich jetzt verständlich ausdrücken.
stifflersmom - Do 29.12.05 19:32
Ich hoffe ich habe Dich verstanden.
Also, Du liest die Datei in Deine Stringlist ein,
und dann gehst Du zeile für Zeile der Stringlist durch und vergleichst die aktuelle Zeile mit
Deinem Vergleichsstring.
Ist der String identisch, dann schmeist Du ihn aus Deiner Stringlist raus.
Anschließend schreibst Du die Stringlist wieder in die Datei.
Ich denke mal, das ist hinzukriegen.
Moin
daywalker0086 - Do 29.12.05 19:42
Es wäre schön wenn du mir einen sagt was ich da ungefär einzugeben hätte, also nich direkt für mein Projekt, nur mal was allgemeines, ich weis jetzt nämlich nicht, wie man das vergleicht.
stifflersmom - Fr 30.12.05 09:34
Ok,
vergleichen tust Du mit dem "=" Zeichen.
Das heißt:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| Procedure BlaBla; Var I : Integer; Begin For I := 0 To SlAlkoven.Count -1 Do if SLAlkoven[I] = ''<tr> <td width="400">'+DBMemo1.Text+ // Vergleichen '<hr></td> <td valign="top"><span style="font-family:' 'Times New Roman'',Times,serif; font-weight:bold; font-size:12pt">'+ EBezeichnung.Text+'</span><br><br>'+'<img src="data/images/gebrauchte/'+ EBild.Text+'.jpg"></td></tr>' Then SlAlkoven.Delete(I); // Und wenn vorhanden, dann löschen end; |
Moin
daywalker0086 - Fr 30.12.05 18:58
Danke, das geht alles soweit, nur, wenn ich den gleichen Eintrag zweimal in meiner Datei sthen hab und dann auf meinen Löschen button drücke, dann kommt da:" List index out of bounds (5) ", kann ich das irgendwie unterbinden? Er soll eigentlich nur einen der beiden einträge löschen.
daywalker0086 - Sa 07.01.06 13:40
Huhu kann mir nichtmal jemand eine Antwort geben dafür oder gibts da keine, kann ich mir aber nicht vorstellen. Helft mir doch mal bitte,
stifflersmom - Sa 07.01.06 16:08
Zeig uns mal mehr von Deinem Code.
Sonst wird eine Hilfestellung eher schwierig.
Moin
daywalker0086 - Sa 07.01.06 18:41
Der Quelltext:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm1.Button2Click(Sender: TObject); Var I : Integer; Begin For I := 0 To SlAlkoven.Count -1 Do if SLAlkoven[I] = ''<tr> <td width="400">'+DBMemo1.Text+ // Vergleichen '<hr></td> <td valign="top"><span style="font-family:' 'Times New Roman'',Times,serif; font-weight:bold; font-size:12pt">'+ EBezeichnung.Text+'</span><br><br>'+'<img src="data/images/gebrauchte/'+ EBild.Text+'.jpg"></td></tr>' Then SlAlkoven.Delete(I); // Und wenn vorhanden, dann löschen SLAlkoven.SaveToFile(alkoven); end; |
So siehts aus aber wie gesagt, das Problem ist die Fehlermeldung wenn mehrere gleiche Datensätze vorhanden sind. die soll dann auch alle gelöscht werden, aber er gibt nur die oben genannte Fehlermeldung aus.
Da gibt es auch noch ein kleines problem: Es soll das Stück: '<img src="data/images/gebrauchte/'+
EBild.Text+'.jpg"> nicht mit auf übereinstimmung geprüft werden, aber wenn ich es einfach löschen, stimmt dann der Datensatz ja nichtmehr mit dem schon in der Datei vorhandenen überein und er löscht den Datensatz nichtmehr, also da bräucht ich auch noch Hilfe wenns geht
stifflersmom - Sa 07.01.06 19:01
Mal sehen...
Beim Löschen bekommst Du also irgendwann die Meldung
"List Index out of Bounds"
Vielleicht verschluckt sich Delphi da ja an der geänderten Menge
der Einträge in Deiner ListBox.
Drehen wir also einfach die Schleife um,
und gehen von hinten nach vorne durch:
Delphi-Quelltext
1: 2:
| For I := SlAlkoven.Count -1 downto 0 Do if SLAlkoven[I] ... |
Tja, und wenn Du nicht die ganze Zeile vergleichen willst,
dann kommst Du nicht darum herum mit POS zu arbeiten:
Delphi-Quelltext
1: 2: 3:
| If (Pos(Ebezeichnung.Text,SLAlkoven[i]) > 0) AND (Pos(EBild.Text,SLAlkoven[i]) > 0) Then SLAlkoven.delete[i] |
Vielleicht kommst Du jetzt ja ein wenig weiter
daywalker0086 - Sa 07.01.06 19:36
Danke das war es was ich suchte
daywalker0086 - Sa 07.01.06 22:33
Hab ein riesen Problem, hab das jetzt so gemacht
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm1.Button2Click(Sender: TObject); Var I : Integer; Begin if CSparte.ItemIndex=0 then begin SLAlkoven.LoadFromFile(alkoven); For I := SlAlkoven.Count -1 downto 0 Do if (Pos(Ebezeichnung.Text,SLAlkoven[i]) > 0) AND (Pos(DBMemo1.Text,SLAlkoven[i]) > 0) Then SLAlkoven.delete(i);
SLAlkoven.SaveToFile(alkoven); |
Es funktioniert auch einwandfrei ABER:
Ich hab die exe Datei nun in dein anderen Ordner verschoben und jetzt so ausgeführt, nun löscht er meine Datensätze nichtmher, aber alles andere funzt soweit noch, woran kann das liegen?
stifflersmom - So 08.01.06 14:24
Hmmm, meine Glaskugel hat gerade den Geist aufgegeben....
Also, entweder Du lieferst mehr Quellcode,
oder aber, Du versuchst mal selber Deine Probleme zu lösen.
Moin
daywalker0086 - So 08.01.06 15:18
Dann eben noch mehr quellcode wenn es der Problemlösung beiträgt aber ich weis nicht was ich da noch mehr quellcode posten soll:
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: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158:
| unit caratech;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids, Buttons, ComCtrls, FMTBcd, DB, SqlExpr, DBTables, OleServer, WordXP, DBClient, DBGrids, ExtCtrls, DBCtrls, Mask, Menus, IniFiles, XPMan, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, WinInet, jpeg, WinSock, IdFTP, IdAntiFreezeBase, IdAntiFreeze, ExtDlgs, printers, OleCtrls, SHDocVw;
type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Label3: TLabel; EBild: TDBEdit; MainMenu1: TMainMenu; Datei1: TMenuItem; Schlieen1: TMenuItem; ClientDataSet1: TClientDataSet; DataSource1: TDataSource; ClientDataSet1ID: TAutoIncField; ClientDataSet1Sparte: TStringField; ClientDataSet1Bezeichnung: TStringField; ClientDataSet1Beschreibung: TMemoField; ClientDataSet1Bildname: TStringField; DBGrid1: TDBGrid; DBMemo1: TDBMemo; EBezeichnung: TDBEdit; CSparte: TDBComboBox; Label4: TLabel; Label5: TLabel; StatusBar1: TStatusBar; XPManifest1: TXPManifest; Bearbeiten1: TMenuItem; htmlDateierstellen1: TMenuItem; htmlDateihochladen1: TMenuItem; GroupBox1: TGroupBox; Button1: TButton; Button2: TButton; IdFTP1: TIdFTP; IdTCPClient1: TIdTCPClient; ProgressBar1: TProgressBar; IdAntiFreeze1: TIdAntiFreeze; Bilderhochladen1: TMenuItem; OpenPictureDialog1: TOpenPictureDialog; GroupBox2: TGroupBox; DBNavigator1: TDBNavigator; Vorschau1: TMenuItem; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Schlieen1Click(Sender: TObject); procedure htmlDateierstellen1Click(Sender: TObject); procedure htmlDateihochladen1Click(Sender: TObject); procedure FtpVerbindung; procedure IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer); procedure IdFTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer); procedure Bilderhochladen1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Vorschau1Click(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private procedure CreateParams(var Params: TCreateParams); override; public end;
var FTP_info, host, ipad, clientverzeichnis, Serververzeichnis, Datendatei:string; RTT, code, hopCount: dword; FTP_Status:Integer; BytesToTransfer: LongWord; Form1: TForm1; inifile: TInifile; test, ftpdat: string; MyItem: TListItem; header, article, alkoven, teilintegriert, kastenwagen, wohnwagen, footer:String; SLHeader, SLArticle, SLAlkoven, SLTeilintegriert, SLKastenwagen, SLWohnwagen, SLFooter, flist, SLComplete: TStrings; implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin
ClientDataSet1.LoadFromFile((ExtractFileDir(Application.ExeName))+'\Datadb.xml'); SLHeader:= TStringList.Create; SLFooter := TStringList.Create; SLComplete := TStringList.Create; SLAlkoven := TStringList.Create; SLTeilintegriert := TStringList.Create; SLKastenwagen := TStringList.Create; SLWohnwagen := TStringList.Create; alkoven:= (ExtractFileDir(Application.ExeName))+'\alkoven.txt'; teilintegriert:= (ExtractFileDir(Application.ExeName))+'\teilintegriert.txt'; kastenwagen:= (ExtractFileDir(Application.ExeName))+'\kastenwagen.txt'; wohnwagen:= (ExtractFileDir(Application.ExeName))+'\wohnwagen.txt'; inifile := TIniFile.Create(IncludeTrailingPathDelimiter(ExtractFileDir(Application.ExeName)) + 'ftp.ini'); clientverzeichnis := inifile.ReadString('ftp', 'clientverzeichnis', ''); serververzeichnis := inifile.ReadString('ftp', 'serververzeichnis', ''); Datendatei := inifile.ReadString('ftp', 'htmlDateiname', '');
end;
procedure TForm1.Button2Click(Sender: TObject); Var I : Integer; Begin if CSparte.ItemIndex=0 then begin SLAlkoven.LoadFromFile(alkoven); For I := SlAlkoven.Count -1 downto 0 Do if (Pos(Ebezeichnung.Text,SLAlkoven[i]) > 0) AND (Pos(DBMemo1.Text,SLAlkoven[i]) > 0) Then SLAlkoven.delete(i); SLAlkoven.SaveToFile(alkoven);
end else if CSparte.ItemIndex=1 then begin SLTeilintegriert.LoadFromFile(teilintegriert); For I := SLTeilintegriert.Count -1 downto 0 Do if (Pos(Ebezeichnung.Text,SLTeilintegriert[i]) > 0) AND (Pos(DBMemo1.Text,SLTeilintegriert[i]) > 0) Then SLTeilintegriert.Delete(I); SLTeilintegriert.SaveToFile(teilintegriert);
end else if CSparte.ItemIndex=2 then begin SLKastenwagen.LoadFromFile(kastenwagen); For I := SLKastenwagen.Count -1 downto 0 Do if (Pos(Ebezeichnung.Text,SLKastenwagen[i]) > 0) AND (Pos(DBMemo1.Text,SLKastenwagen[i]) > 0) Then SLKastenwagen.Delete(I); SLKastenwagen.SaveToFile(kastenwagen);
end else begin SLWohnwagen.LoadFromFile(wohnwagen); For I := SLWohnwagen.Count -1 downto 0 Do if (Pos(Ebezeichnung.Text,SLWohnwagen[i]) > 0) AND (Pos(DBMemo1.Text,SLWohnwagen[i]) > 0) Then SLWohnwagen.Delete(I); SLWohnwagen.SaveToFile(wohnwagen); end; end; |
Das ist das Stück Quellcode, was nicht funktioniert! Noch den Rest Quellcode?
Aber das funktioniert ja alles...
stifflersmom - So 08.01.06 15:58
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure TForm1.FormCreate(Sender: TObject); begin ClientDataSet1.LoadFromFile((ExtractFileDir(Application.ExeName))+'\Datadb.xml'); SLHeader:= TStringList.Create; SLFooter := TStringList.Create; SLComplete := TStringList.Create; SLAlkoven := TStringList.Create; SLTeilintegriert := TStringList.Create; SLKastenwagen := TStringList.Create; SLWohnwagen := TStringList.Create; alkoven:= (ExtractFileDir(Application.ExeName))+'\alkoven.txt'; teilintegriert:= (ExtractFileDir(Application.ExeName))+'\teilintegriert.txt'; kastenwagen:= (ExtractFileDir(Application.ExeName))+'\kastenwagen.txt'; wohnwagen:= (ExtractFileDir(Application.ExeName))+'\wohnwagen.txt'; inifile := TIniFile.Create(IncludeTrailingPathDelimiter(ExtractFileDir(Application.ExeName)) + 'ftp.ini'); clientverzeichnis := inifile.ReadString('ftp', 'clientverzeichnis', ''); serververzeichnis := inifile.ReadString('ftp', 'serververzeichnis', ''); Datendatei := inifile.ReadString('ftp', 'htmlDateiname', ''); end; |
Tja, Dein Programm erwartet sämtliche Dateien
im selben Verzeichnis wie das Programm selbst.
Wenn Du die Exe verschiebst, müssen sämtliche
anderen Dateien in das selbe Verzeichnis.
Im übrigen würde ich Dir (für die Übersichtlichkeit)
in Deinem Code empfehlen, eine Variable mehr zu
deklarieren, und der dann denn Wert (String) des
Programmverzeichnisses übergeben, danach liest sich dann
dein Code wesentlich angenehmer:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure TForm1.FormCreate(Sender: TObject); begin StartDir := ExtractFilePath(ParamStr(0)); ClientDataSet1.LoadFromFile(StartDir+'\Datadb.xml'); SLHeader:= TStringList.Create; SLFooter := TStringList.Create; SLComplete := TStringList.Create; SLAlkoven := TStringList.Create; SLTeilintegriert := TStringList.Create; SLKastenwagen := TStringList.Create; SLWohnwagen := TStringList.Create;
alkoven:= StartDir+'alkoven.txt'; teilintegriert:= StartDir+'teilintegriert.txt'; kastenwagen:= StartDir+'kastenwagen.txt'; end; |
So könntest Du dann auch noch relativ leicht und
gut lesbar mit Unterverzeichnissen arbeiten,
in dem Du alle Deine "Datenbanken" in ein Unterverzeichnis
"DAT" verschiebst und aus Deinem Programm heraus diese dann
von dort aus öffnest, aber das ist Geschmackssache
(müllt aber Dein Programmverzeichnis nicht so zu).
Delphi-Quelltext
1:
| allkoven := StartDir+'dat\allkoven.txt'; |
Moin
daywalker0086 - So 08.01.06 16:12
Danke für den Tipp, aber meinst du daran liegt es das die löschprozedur nicht funktioniert, ich hab alle Dateien im gleichen Verzeichnis, aber diese Prozedur funzt nicht obwohl alle anderen Prozeduren funktionieren.
stifflersmom - So 08.01.06 18:13
Ich hab Dich jetzt nicht wirklich verstanden.
Welche Procedure funktioniert denn nicht.
Wie wäre es denn, nebenbei bemerkt, deine Funktion
zum löschen der Datensätze in eine eigene Procedure zu packen und so
zu formulieren, daß sie für alle Deine "Datenbanken" funktioniert.
Dein Code wird dann übersichtlicher, besser zu warten und Du
brauchst auch längst nicht mehr so viele variablen vom Typ TStringList.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| Procedure CheckDatenbank(Datei,Text1,Text2:String); Var I : Integer; SL : TstringList; Begin SL.Create; SL.LoadFromFile(Datei); For I := Sl.Count -1 downto 0 Do if (Pos(Text1,SL[i]) > 0) AND (Pos(Text2,SL[i]) > 0) Then SL.delete(i); SL.SaveToFile(Datei); SL.Free; end |
Damit könntest Du Deine Procedure Button2Click (ist 'n scheiß Name) wesentlich übersichtlicher halten:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| procedure TForm1.Button2Click(Sender: TObject); Begin Case CSparte.ItemIndex of 0 : CheckDatenbank(Alkoven,EBezeichnung.Text,DBMemo1.Text); 1 : CheckDatenbank(Teileintegriert,EBzeichnung.Text, DBMemo1.Text); Bla Bla Bla End; End; |
Tja, und wenn Du immer nur die Selbern werte vergleichst, "EBezeichnung.Text und DBMemo1.Text"
dann brauchst Du die ja nicht variable zu halten und könntest so die "CheckDatenbank" Procedure
noch einwenig kürzen...
Und, noch Fragen
daywalker0086 - So 08.01.06 19:29
Das find ich voll cool, so werd ich das auch umschreiben, hab mich schon aufgeregt, das der Quellcode für das bissl so lang ist.
Aber da du mich noch nicht richtig verstanden hast: Die Procedur, die ich gepostet habe, also
procedure TForm1.Button2Click(Sender: TObject);
funktioniert, wenn ich das Programm im Delphiordner: Projedts/.. starte einwandfrei, aber sobald ich das Programm, und alle Dateien die meines Wissend dazugehören in einem Ordner auf meinem Desktop kopiere und dann starte nichtmehr, aber alle anderen Proceduren in meinem Programm tuns noch, thats the Problem!
Ja so siehts aus aber danke für Kürzugsvorschläge für den Code
Nachtrag:
Hab den Code umgeschrieben und die Procedure oben eingebunden, aber erhalte folgenden Fehler:
Unsatisfied forward or external declaration: 'TForm1.CheckDatenbank'
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:
| uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids, Buttons, ComCtrls, FMTBcd, DB, SqlExpr, DBTables, OleServer, WordXP, DBClient, DBGrids, ExtCtrls, DBCtrls, Mask, Menus, IniFiles, XPMan, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, WinInet, jpeg, WinSock, IdFTP, IdAntiFreezeBase, IdAntiFreeze, ExtDlgs, printers, OleCtrls, SHDocVw;
type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Label3: TLabel; EBild: TDBEdit; MainMenu1: TMainMenu; Datei1: TMenuItem; Schlieen1: TMenuItem; ClientDataSet1: TClientDataSet; DataSource1: TDataSource; ClientDataSet1ID: TAutoIncField; ClientDataSet1Sparte: TStringField; ClientDataSet1Bezeichnung: TStringField; ClientDataSet1Beschreibung: TMemoField; ClientDataSet1Bildname: TStringField; DBGrid1: TDBGrid; DBMemo1: TDBMemo; EBezeichnung: TDBEdit; CSparte: TDBComboBox; Label4: TLabel; Label5: TLabel; StatusBar1: TStatusBar; XPManifest1: TXPManifest; Bearbeiten1: TMenuItem; htmlDateierstellen1: TMenuItem; htmlDateihochladen1: TMenuItem; GroupBox1: TGroupBox; Button1: TButton; Button2: TButton; IdFTP1: TIdFTP; IdTCPClient1: TIdTCPClient; ProgressBar1: TProgressBar; IdAntiFreeze1: TIdAntiFreeze; Bilderhochladen1: TMenuItem; OpenPictureDialog1: TOpenPictureDialog; GroupBox2: TGroupBox; DBNavigator1: TDBNavigator; Vorschau1: TMenuItem; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Schlieen1Click(Sender: TObject); procedure htmlDateierstellen1Click(Sender: TObject); procedure htmlDateihochladen1Click(Sender: TObject); procedure FtpVerbindung; procedure IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer); procedure IdFTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer); procedure Bilderhochladen1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Vorschau1Click(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); Procedure CheckDatenbank(Datei,Text1,Text2:String); private
procedure CreateParams(var Params: TCreateParams); override; public
end; |
stifflersmom - So 08.01.06 20:13
Klar, wenn du die Procedure oben (zur Form) deklarierst,
dann musst Du sie auch (unten) dementsprechend benennen.
Wenn Du dir mal die Deklaratiionen (der bestehenden Proceduren)
genauer ansiehst, wirst Du schon drauf kommen.
An sonsten:
Delphi-Quelltext
1:
| Procedure Tform1.checkdatenbanken... |
| Zitat: |
Aber da du mich noch nicht richtig verstanden hast: Die Procedur, die ich gepostet habe, also
procedure TForm1.Button2Click(Sender: TObject);
funktioniert, wenn ich das Programm im Delphiordner: Projedts/.. starte einwandfrei, aber sobald ich das Programm, und alle Dateien die meines Wissend dazugehören in einem Ordner auf meinem Desktop kopiere und dann starte nichtmehr, aber alle anderen Proceduren in meinem Programm tuns noch, thats the Problem |
Doch, habe ich.
An sich MUSS Dein Programm (wenn Du nicht DOCH irgendwo im Quelltext eine absolute Pfadangabe
hinterlegt hast) auch von einem anderen Verzeichnis aus zu starten sein.
Ich weiß auch nicht genau, ob Du nicht um Unterverzeichnis Deines Desktops
irgendwie Probleme kriegst.
Mach Doch einfach mal ein Verzeichnis in z.B. C:\Programme
schieb ALLE notwendigen Dateien da rein und versuchs noch mal von dort aus.
Wenn es denn so klappt, kannst Du Dir ja eine Verknüpfung von dem Programm auf
Deinen Desktop legen.
Moin
daywalker0086 - So 08.01.06 20:25
mein Quelltext:
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: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117:
| unit caratech;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids, Buttons, ComCtrls, FMTBcd, DB, SqlExpr, DBTables, OleServer, WordXP, DBClient, DBGrids, ExtCtrls, DBCtrls, Mask, Menus, IniFiles, XPMan, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, WinInet, jpeg, WinSock, IdFTP, IdAntiFreezeBase, IdAntiFreeze, ExtDlgs, printers, OleCtrls, SHDocVw;
type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Label3: TLabel; EBild: TDBEdit; MainMenu1: TMainMenu; Datei1: TMenuItem; Schlieen1: TMenuItem; ClientDataSet1: TClientDataSet; DataSource1: TDataSource; ClientDataSet1ID: TAutoIncField; ClientDataSet1Sparte: TStringField; ClientDataSet1Bezeichnung: TStringField; ClientDataSet1Beschreibung: TMemoField; ClientDataSet1Bildname: TStringField; DBGrid1: TDBGrid; DBMemo1: TDBMemo; EBezeichnung: TDBEdit; CSparte: TDBComboBox; Label4: TLabel; Label5: TLabel; StatusBar1: TStatusBar; XPManifest1: TXPManifest; Bearbeiten1: TMenuItem; htmlDateierstellen1: TMenuItem; htmlDateihochladen1: TMenuItem; GroupBox1: TGroupBox; Button1: TButton; Button2: TButton; IdFTP1: TIdFTP; IdTCPClient1: TIdTCPClient; ProgressBar1: TProgressBar; IdAntiFreeze1: TIdAntiFreeze; Bilderhochladen1: TMenuItem; OpenPictureDialog1: TOpenPictureDialog; GroupBox2: TGroupBox; DBNavigator1: TDBNavigator; Vorschau1: TMenuItem; DBRichEdit1: TDBRichEdit; Button3: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Schlieen1Click(Sender: TObject); procedure htmlDateierstellen1Click(Sender: TObject); procedure htmlDateihochladen1Click(Sender: TObject); procedure FtpVerbindung; procedure IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer); procedure IdFTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer); procedure Bilderhochladen1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Vorschau1Click(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); Procedure CheckDatenbank(Datei,Text1,Text2:String); procedure Button3Click(Sender: TObject); private
procedure CreateParams(var Params: TCreateParams); override; public
end;
var FTP_info, host, ipad, clientverzeichnis, Serververzeichnis, Datendatei:string; RTT, code, hopCount: dword; FTP_Status:Integer; BytesToTransfer: LongWord; Form1: TForm1; inifile: TInifile; test, ftpdat: string; MyItem: TListItem; header, article, alkoven, teilintegriert, kastenwagen, wohnwagen, footer:String; SLHeader, SLArticle, SLAlkoven, SLTeilintegriert, SLKastenwagen, SLWohnwagen, SLFooter, flist, SLComplete: TStrings; implementation
uses Unit2;
{$R *.dfm}
Procedure CheckDatenbank(Datei,Text1,Text2:String); Var I : Integer; SL : TstringList; Begin SL.Create; SL.LoadFromFile(Datei); For I := Sl.Count -1 downto 0 Do if (Pos(Text1,SL[i]) > 0) AND (Pos(Text2,SL[i]) > 0) Then SL.delete(i); SL.SaveToFile(Datei); SL.Free; end; procedure TForm1.Button2Click(Sender: TObject); Begin Case CSparte.ItemIndex of 0 : CheckDatenbank(alkoven,EBezeichnung.Text,DBMemo1.Text); 1 : CheckDatenbank(Teilintegriert,EBezeichnung.Text, DBMemo1.Text); 2 : CheckDatenbank(Kastenwagen,EBezeichnung.Text, DBMemo1.Text); 3 : CheckDatenbank(Wohnwagen,EBezeichnung.Text, DBMemo1.Text); End; End; |
Was ist jetzt falsch? Immernoch unsatisfied forward or... Fehler
stifflersmom - So 08.01.06 20:28
Wie gesagt, Du würdest bestimmt noch darauf kommen, wenn Du mal ein wenig länger auf diesen
Quellcode und alle anderen die Du schon mit Delphi gebaut hast, schaust.
Gut, ich will mal nicht so sein:
aus:
Delphi-Quelltext
1: 2: 3:
| Procedure CheckDatenbank(Datei,Text1,Text2:String); Var I : Integer; SL : TstringList; |
wird:
Delphi-Quelltext
1: 2: 3:
| Procedure TForm1.CheckDatenbank(Datei,Text1,Text2:String); Var I : Integer; SL : TstringList; |
Na dann, viel Spaß
daywalker0086 - So 08.01.06 20:45
Es tut mir leid dich imer belästigen zu müssen aber es gibt immernoch ein Problem, also mit dem TForm1 hät ich wirklich auch selbst drauf kommen müsen, aber hab nur im Implementationsteil geguggt :oops:
Aber wenn ich jetzt mein löschen Button drücke dann bekomm ich folgende Exception:
Access violation at adress 004037CE in module 'cara4tech.exe' Read of Adress 8BD88B4F
und er zeigt auf folgende Zeile:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.Button2Click(Sender: TObject); Begin Case CSparte.ItemIndex of 0 : CheckDatenbank(alkoven,EBezeichnung.Text,DBMemo1.Text); <-- Hier wenn mein Index 0 war 1 : CheckDatenbank(Teilintegriert,EBezeichnung.Text, DBMemo1.Text); 2 : CheckDatenbank(Kastenwagen,EBezeichnung.Text, DBMemo1.Text); 3 : CheckDatenbank(Wohnwagen,EBezeichnung.Text, DBMemo1.Text); End; End; |
wo liegt da schonwieder der fehler?
stifflersmom - Mo 09.01.06 20:07
Kann ich jetzt wirklich nicht erkennen.
Da bleibt Dir nichts weiter übrig, als die routine "Checkdatenbanken" schrittweise mit F7 zu debuggen.
Dann bekommst Du die genaue Zeile in dem der Fehler auftritt.
Moin
daywalker0086 - Mo 09.01.06 23:27
Habs gefunden!!!! :lol:
Es Muss heißen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| Procedure TForm1.CheckDatenbank(Datei,Text1,Text2:String); Var I : Integer; SL : TstringList; Begin
SL:=TStringList.Create; SL.LoadFromFile(Datei); For I := Sl.Count -1 downto 0 Do if (Pos(Text1,SL[i]) > 0) AND (Pos(Text2,SL[i]) > 0) Then SL.delete(i); SL.SaveToFile(Datei); SL.Free; end; |
stifflersmom - Di 10.01.06 20:00
Na wunderbar.
Und, läuft Dein Programm jetzt auch in einem anderen Verzeichnis?
Moin
daywalker0086 - Di 10.01.06 21:24
Jo läuft jetzt auch in anderen Verzeichnissen, aber ein Problem gibts noch:
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:
| procedure TForm1.Button2Click(Sender: TObject); Begin Case CSparte.ItemIndex of 0 : CheckDatenbank(alkoven,EBezeichnung.Text,DBMemo1.Text); 1 : CheckDatenbank(Teilintegriert,EBezeichnung.Text, DBMemo1.Text) ; 2 : CheckDatenbank(Kastenwagen,EBezeichnung.Text, DBMemo1.Text); 3 : CheckDatenbank(Wohnwagen,EBezeichnung.Text, DBMemo1.Text) else exit; End; End;
Procedure TForm1.CheckDatenbank(Datei,Text1,Text2:String); Var I : Integer; SL : TstringList; Begin
SL:=TStringList.Create; SL.LoadFromFile(Datei); For I := Sl.Count -1 downto 0 Do if (Pos(Text1,SL[i]) > 0) AND (Pos(Text2,SL[i]) > 0) Then SL.delete(i); SL.SaveToFile(Datei); SL.Free; end; |
Immer wenn eigentlich Index 0 ausgewählt ist löscht das Programm einfach den Datensatz nicht.
Aber bei allen anderen Index(en :?: ) funktioniert es.
Ich hab keine Ahnung warum das so ist, ist auf alle Fählle schlecht, so wie es ist.
daywalker0086 - Do 12.01.06 17:32
Also, weis jetzt warum er nicht jeden Eintrag löscht!
Wenn ich Text in mein DBMemofeld eingebe und ihn dann in meine Textdatei schreiben lasse und dann wieder meine Löschprozedur aufrufe löscht er den Text so wie es sein soll.
ABER wenn ich den Text in meinem DBMemo mit der Procedur:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| procedure TForm1.Button4Click(Sender: TObject); begin if DBMemo1.SelText='' then exit else ClientDataSet1.Edit; DBMemo1.SelText := '<span style="color:#e2671c">'+DBMemo1.SelText+'</span>'; end; |
bearbeite und ihn dann der TextDatei hinzufüge, dann löscht er mir den Text anschließend nichtmehr
Hier nochmal meine schreib und löschproceduren:
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:
| procedure TForm1.HinzufuegenClick(Sender: TObject); Var Inhalt: string; begin if EBild.text= '' then Inhalt:='<tr> <td width="400">'+DBMemo1.Text+'<p align="right" style="color:#e2671c"><strong>'+DBErgaenzung.Text+'<strong></p><hr></td> <td valign="top"><span style="font-family:''Times New Roman'',Times,serif; font-weight:bold; font-size:12pt">'+EBezeichnung.Text+'</span><br><br></td></tr>' else Inhalt:='<tr> <td width="400">'+DBMemo1.Text+'<p align="right" style="color:#e2671c"><strong>'+DBErgaenzung.Text+'<strong></p><hr></td> <td valign="top"><span style="font-family:''Times New Roman'',Times,serif; font-weight:bold; font-size:12pt">'+EBezeichnung.Text+'</span><br><br><img src="data/images/gebrauchte/'+EBild.text+'.jpg"></td></tr>' ;
Begin Case CSparte.ItemIndex of 0 : Hinzufuegen(alkoven,'<tr><td align="left" colspan=2 style="font-family:''Times New Roman'',Times,serif; font-weight:bold; font-size:14pt; color:#E3C815; background-image:url(data/images/table_middle.gif)">Alkoven<br> </td></tr>',Inhalt); 1 : Hinzufuegen(alkoven,'<tr><td align="left" colspan=2 style="font-family:''Times New Roman'',Times,serif; font-weight:bold; font-size:14pt; color:#E3C815; background-image:url(data/images/table_middle.gif)">Teilintegrierte<br> </td></tr>',Inhalt); 2 : Hinzufuegen(alkoven,'<tr><td align="left" colspan=2 style="font-family:''Times New Roman'',Times,serif; font-weight:bold; font-size:14pt; color:#E3C815; background-image:url(data/images/table_middle.gif)">Kastenwagen<br> </td></tr>',Inhalt); 3 : Hinzufuegen(alkoven,'<tr><td align="left" colspan=2 style="font-family:''Times New Roman'',Times,serif; font-weight:bold; font-size:14pt; color:#E3C815; background-image:url(data/images/table_middle.gif)">Wohnwagen<br> </td></tr>',Inhalt); else exit; End; end; end;
procedure TForm1.Hinzufuegen(Datei,Suchtext,Text :String); Var I : Integer; SL : TstringList;
Begin
SL:=TStringList.Create; SL.LoadFromFile(Datei); For I := Sl.Count -1 downto 0 Do if (Pos(Suchtext,SL[i]) > 0) Then SL.Insert(I+1,Text);
SL.SaveToFile(Datei); SL.Free; end;
procedure TForm1.loeschenClick(Sender: TObject); Begin Case CSparte.ItemIndex of 0 : CheckDatenbank(alkoven,EBezeichnung.Text, DBMemo1.Text); 1 : CheckDatenbank(alkoven,EBezeichnung.Text, DBMemo1.Text) ; 2 : CheckDatenbank(alkoven,EBezeichnung.Text, DBMemo1.Text); 3 : CheckDatenbank(alkoven,EBezeichnung.Text, DBMemo1.Text) else exit; End; End;
Procedure TForm1.CheckDatenbank(Datei,Text1,Text2:String); Var I : Integer; SL : TstringList; Begin
SL:=TStringList.Create; SL.LoadFromFile(Datei); For I := Sl.Count -1 downto 0 Do if (Pos(Text1,SL[i]) > 0) and (Pos(Text2,SL[i]) > 0) Then SL.delete(i); SL.SaveToFile(Datei); SL.Free; end; |
ALso es liegt an meiner Procedure für das hinzufügen der html Tags aber kann mir da jemand sagen wie ich das anders schreiben kann, damit es dann funktioniert? Beim löschen vergleiche ich ja den Text im Memofeld und den Text in der Textdatei, nur irgendwie ist der Text nach dem hinzufügen der Tags nichtmehr der gleiche, obwohl er ja nach dem hinzufügen in der Textdatei steht. :cry:
spaxxn - Mo 23.01.06 15:08
ich weiss ja net, ob das löschen problem noch besteht, aber:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| Procedure CheckDatenbank(Datei,Text1,Text2:String); Var I : Integer; SL : TstringList; Begin SL.Create; SL.LoadFromFile(Datei); For I := Sl.Count -1 downto 0 Do if (Pos(Text1,SL[i]) > 0) AND (Pos(Text2,SL[i]) > 0) Then SL.delete(i); SL.SaveToFile(Datei); SL.Free; end; |
die liste wird schon beim ersten durchlauf freigegeben? wie soll das dann funktionieren? beim nächsten durchlauf, wird auf eine nicht mehr vorhandene liste zugegriffen. probier mal dies:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| Procedure CheckDatenbank(Datei,Text1,Text2:String); Var I : Integer; SL : TstringList; Begin try SL.Create; SL.LoadFromFile(Datei); i := 0; while i < SL.Count do begin if (Pos(Text1,SL[i]) > 0) AND (Pos(Text2,SL[i]) > 0) Then begin SL.delete(i) end else inc(i); end; SL.SaveToFile(Datei); finally SL.Free; end; end; |
nicht gleich hauen, aber hatte keine zeit mir alles vorher durchzulesen
edit: arbeite mal mit textformatierung bitte, dann sieht man auch was du da so proggst ... :) das mit dem freigeben ziehe ich zurück
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!