Entwickler-Ecke

Sonstiges (Delphi) - Erkennung von Zahlen, in bestimmten Zeilen.


LuckyStrike4life - Mo 08.09.03 14:49
Titel: Erkennung von Zahlen, in bestimmten Zeilen.
Morgen,

ja mit dem Titel hab ich mich schwer getan, denn mein Problem ist nicht mit einer Zeile zu erklären.

Daher mach ich dies jetzt:

Ich hab die Aufgabe, ein Programm zu entwickeln - welches Datenbankinhalte aufnimmt, abgleicht und diese Informationen an die richtige Datenbank anpasst.

Aber damit kann ich noch nicht beginnen, erstmal muss ich aus einer Datenbank ermitteln, wie oft ein bestimmter Wert verwendet wurde. Ich poste mal ein Auszug aus der Datenbank:


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:
000151000101200312030037200
102301a010020000001[b]001[/b]00173002      03        000
202301a0109699                                                               
332301a0111102100
342301a011001100  000          
402301a0110200  071  0063                            280      1010      305   00010                          02   0060   006         
402301a0110300  060  0050                            190      1310      305   00040                          02   0070   006         
402301a0110400  080  0050                            190      1320      305   00027                          02   0060   006         
402301a0110500  011  0061                            230      1310      305   00020                          02   0030   006         
402301a0110100  080  0071                            280      1014      305   00076                          02   0070   006         
102301a020020000001[b]001[/b]00118002      03        000
202301a0209699                                                               
332301a0211102100
342301a021001100  000          
402301a0210100  080  0063                            260      1215      305   00044                          0201 0070   006         
402301a0210200  011  0060                            230      1210      305   00030                          0201 0070   006         
402301a0210300  032  0060                            260      1210      405   00014                          0201 0090   006         
402301a0210400  060  0048                            200      1001      305   00015                          0201 0040   006         
402301a0210500  091  0063                            260      1230      305   00015                          0201 0050   006         
102301a030020000001[b]001[/b]00669002      03        000
202301a0309699                                                               
332301a0311102100
342301a031001100  000          
402301a0310100  020  0063                            250      1301      302   00210                          0201 0095   006         
402301a0310402  020  0011                                     1010      301   00100                                                  
402301a0310200  071  0063                            270      1310      302   00210                          0201 0050   006         
402301a0310300  011  0063                            230      1010      302   00249                          0201 0040   006         
102301a040020000001[b]001[/b]00264002      03        000
202301a0409699                                                               
332301a0411102100
342301a041001100  000          
402301a0410100  020  0163                            300      1128      302   00092                          13       030007         
402301a0410200  011  0163                            310      1114      302   00081                          13       030007         
402301a0410300  021  0163                            290      1130      501   00053                          13       030007         
402301a0410400  031  0063                            250      1411      301   00038                          02   0095               
502301a04102021        011035004            
502301a04103021        021030004            
502301a0410102100068   020035004      01    
802301a041Wenn erforderlich Kulturgatter anlegen.
102301a050020000001[b]001[/b]00457002      03        000
202301a0509699                                                               
332301a0511102100
342301a051001100  010          
402301a0510400  031  0087                            290      1210      301   00055                          02   0080   006         
402301a0510100  020  0086                            310      1004      302   00352                          02   0065   006         
402301a0510200  011  0086                            280      1010      302   00040                          02   0030   006         
402301a0510300  041  0082                            280      1006      301   00010                                      093


Wichtig ist der Wert, in diesem Beispiel immer "001", den ich versucht habe fett auszugeben, was aber wohl durch die Deklaration "Code" nichts wird.

Dieser Wert muss automatisch gefunden und notiert werden.
Es ist möglich dem Programm zu sagen welche Zeilen relevant sind, dass sind immer nur die, die mit einer "10" beginnen und der Wert beginnt immer an der 19en Stelle und endet an der 22en Stelle.

Hat jemand eine Idee wie man so ein Programm angehen kann? Wäre sehr wichtig, ansonsten liegt die Sache weiterhin auf Eis... .


Tino - Mo 08.09.03 15:39

Hallo,

Du gehst halt in einer Schleife die einzelnen Zeilen durch und prüfst ob diese mit 10 anfangen:

Delphi-Quelltext
1:
If Copy (Str, 12) = '10' Then                    

Wenn diese mit 10 anfangen dann kannst wiederum mit Copy prüfen ob an der 19 Stelle 001 steht.

Gruß
Tino


LuckyStrike4life - Di 09.09.03 09:05

Das hört sich ja schon mal gut an,

aber wie bekomme ich das Programm dazu, diesen Text denn auch auf die Datei anzuwenden? Muss ich dafür die Daten laden lassen? Also, zum Beispiel eine Menüleiste erstellen, mit der Funktion zum laden von txt Datein?


Tino - Di 09.09.03 09:58

Hallo!

LuckyStrike4life hat folgendes geschrieben:
Muss ich dafür die Daten laden lassen?

Natürlich. Wenn du mit dem Text arbeiten möchtest musst du den irgendwie "laden". Vielleicht so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
Var
  SL: tStringList;
Begin
  SL := tStringList.Create;
  Try
    SL.LoadFromFile ('c:\logfile.txt');
    { Hier kannst du jetzt auf das Zeilen zugreifen und verarbeiten }
  Finally
    SL.Free;
  End;
End;

LuckyStrike4life hat folgendes geschrieben:
Also, zum Beispiel eine Menüleiste erstellen, mit der Funktion zum laden von txt Datein?

Das weiß ich doch nicht wie du dein Programm aufbauen willst. Das musst du schon selbst entscheiden und dann auch programmieren.

Gruß
Tino


LuckyStrike4life - Di 09.09.03 10:33

Danke,

werd das dann jetzt mal so probieren. Kommen aber sicher noch ein paar Fragen :lol: .

Ich bezieh mich mal ganz auf meine Signatur.


LuckyStrike4life - Di 09.09.03 10:55

Das mag irgendwie noch nicht so ganz, hab deinen Code mal auf eine ButtonClick Funktion gelegt:


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:
unit MainFormpas;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TMainForm = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  MainForm: TMainForm;
Var 
  SL: tStringList;

implementation

{$R *.DFM}

procedure TMainForm.Button1Click(Sender: TObject);
begin
Begin
  SL := tStringList.Create;
  Try
    SL.LoadFromFile ('c:\logfile.txt');
     If Copy (Str, 12) = '10' Then
     test1.show;
                    { Hier kannst du jetzt auf das Zeilen zugreifen und verarbeiten }
  Finally
    SL.Free;
  End;
End;
end;

end.

So wie es jetzt steht kanns sicher auch noch nicht funktionieren, aber Delphi mag noch nicht mal compilieren.
Bei "If Copy (Str, 1, 2) = '10' Then" meint Delphi
Zitat:
[Fehler] MainFormpas.pas(34): '(' erwartet, aber ',' gefunden
[Fehler] MainFormpas.pas(34): Inkompatible Typen
.

Was íst denn falsch?


CenBells - Di 09.09.03 12:39

Hallo,

es sollte besser so heißen


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TMainForm.Button1Click(Sender: TObject); 
Begin 
  SL := tStringList.Create; 
  Try 
    SL.LoadFromFile ('c:\logfile.txt'); 
     If Copy (Sl[0], 12) = '10' Then begin //jetzt überprüfst du die 1. zeile
     test1.show; 
                    { Hier kannst du jetzt auf das Zeilen zugreifen und verarbeiten } 
    end;
  Finally 
    SL.Free; 
  End
end;


das ganze geraffel mit copy solltest du noch in eine for schleife packen und dann kannst du die ganze liste abarbeiten.

Gruß
Ken[/delphi]


LuckyStrike4life - Di 09.09.03 13:09

Danke dir,

das bringt mich schon ein Stück weiter.


Tino - Di 09.09.03 14:40

Hallo!

Außerdem würde ich dir empfehlen dir die Grundlagen von Delphi (Pascal [Delphi-Language]) anzueignen. Ohne diese ist es viel zu schwierig vernünftig weiter zu arbeiten.

Hier ein Seite die ich dir emfehlen kann: Marco Cantù's Essential Pascal (deutsch) [http://www.marcocantu.com/EPascal/German/]!

Gruß
Tino


LuckyStrike4life - Mi 10.09.03 09:46

Morgen,

naja - n wenig Grundwissen sollte ich schon haben, also ich bin zumindest nicht der absolute Anfänger. Natürlich reicht es nicht aus um zu sagen das ich Delphi könnte, aber vielleicht ansatzweise. Den Link werd ich aber sicher trotzdem gut verwenden können, Danke.

Ich hab jetzt den letzten Code der von CenBells kam ordentlich getestet und er funktioniert auch. Allerdings hab ich noch ein paar Fragen dazu.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TMainForm.Button1Click(Sender: TObject);
begin
  SL := tStringList.Create;
  Try
    SL.LoadFromFile ('c:\test.txt');
     If Copy (Sl[0], 12) = '10' Then begin
     Application.Terminate;
    end;
  Finally
    SL.Free;
  End;
end;


Application.Terminate; hab ich eingesetzt um zu überprüfen ob es tatsächlich funktioniert und wie auch schon gesagt - es geht.

Aber was für mich jetzt noch wichtig wäre, wie kann ich dem Programm sagen das es wenn die ersten beiden Zahlen "1" und "0" sind, dass in der gleichen Zeile ab der 19ten Stelle bis zur 22sten Stelle die Zahlen ausgelesen werden müssen und irgendwo hin gespeichert werden. So das der User diese Später auslesen kann.

Da komm ich leider nicht drauf :( .


CenBells - Mi 10.09.03 10:26

Hallo,

LuckyStrike4life hat folgendes geschrieben:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TMainForm.Button1Click(Sender: TObject);
begin
  SL := tStringList.Create;
  Try
    SL.LoadFromFile ('c:\test.txt');
     If Copy (Sl[0], 12) = '10' Then begin
     Application.Terminate;
    end;
  Finally
    SL.Free;
  End;
end;


Application.Terminate; hab ich eingesetzt um zu überprüfen ob es tatsächlich funktioniert und wie auch schon gesagt - es geht. :roll:

Aber was für mich jetzt noch wichtig wäre, wie kann ich dem Programm sagen das es wenn die ersten beiden Zahlen "1" und "0" sind, dass in der gleichen Zeile ab der 19ten Stelle bis zur 22sten Stelle die Zahlen ausgelesen werden müssen und irgendwo hin gespeichert werden. So das der User diese Später auslesen kann.


Also, was ist auslesen aus einem string??? Rauskopieren. Das steht doch schon in den hier diskutierten codebeispielen. Wenn du eine zeile mit 10 gefunden hast, musst du also ab stelle 19 drei zechen kopieren (OH: copy).Das machst du also anstelle deines Application.terminate;
Das Abspeichern kann man nicht per default lösung machen:
Du könntest eine kleine Tabelle (DBase, Paradox, etc) erstellen und deine werte dort hinein speichern oder du speicherst deine Werte in eine typisierte datei.
Du musst dir vielleicht erstmal klar werden, wie die speicherung aussehen soll, bevor du dich daran versuchst.

Edit: und wenn du dir den link angeschaut hättest, wäre dir sehr schnell klar geworden, wie man die aufgabe mit dem rauslesen löst. Wahrscheinlich hätte das buch dir auch bei der speicherung geholfen.

Gruß
Ken


Tino - Mi 10.09.03 10:56

Hallo!

LuckyStrike4life hat folgendes geschrieben:
naja - n wenig Grundwissen sollte ich schon haben, also ich bin zumindest nicht der absolute Anfänger. Natürlich reicht es nicht aus um zu sagen das ich Delphi könnte, aber vielleicht ansatzweise.

Ich hab dir den Link nur geben weil ich der Meinung war das dir ein wenig grundlegendes Wissen im Bereich Delphi fehtl da du so etwas gecodet hast:

Delphi-Quelltext
1:
2:
3:
4:
5:
begin
begin
  { ... }
end;
end;

War von mir auf jeden Fall nicht böse gemeint.

LuckyStrike4life hat folgendes geschrieben:
Ich hab jetzt den letzten Code der von CenBells kam ordentlich getestet und er funktioniert auch.

Ich hoffe du weißt warum der Code von CenBells (ist übrigends der gleiche Code den ich schon am Anfag des Topics gepostet habe) jetzt funktioniert :-D

Gruß
Tino


LuckyStrike4life - Mi 10.09.03 12:34

CenBells hat folgendes geschrieben:

Wenn du eine zeile mit 10 gefunden hast, musst du also ab stelle 19 drei zechen kopieren (OH: copy).Das machst du also anstelle deines Application.terminate;
Das Abspeichern kann man nicht per default lösung machen:
Du könntest eine kleine Tabelle (DBase, Paradox, etc) erstellen und deine werte dort hinein speichern oder du speicherst deine Werte in eine typisierte datei.


Ja, an soetwas hab ich gedacht. Das also die Werte gleich in eine Tabelle geschrieben werden, am besten wäre dBase. Soweit auch nicht das Problem, da reichen meine Kentnisse noch bis zum erstellen, verknüpfen usw. .
Aber mir geht nicht ganz auf wie ich denn nun diese neue Zeile angehen muss, wie soll ich dem System sagen das er nach der 19ten stelle 3 Zahlen rauslesen muss und dann diese in die Datenbank zu speichern hat.

Tino hat folgendes geschrieben:
Ich hab dir den Link nur geben weil ich der Meinung war das dir ein wenig grundlegendes Wissen im Bereich Delphi fehtl da du so etwas gecodet hast: [...]
War von mir auf jeden Fall nicht böse gemeint.


So hab ich es auch nicht aufgefasst. Hab mir eben dort auch noch einiges zu "Strings" durchgelesen, werde diese Seite auch noch stärker nutzen. Da bin ich mir sicher. Nur komisch das ich die nicht gefunden habe, als ich vor einigen Monaten direkt nach solchen Seiten gesucht habe. Nochmals Danke.


Tino - Mi 10.09.03 14:15

Hallo,

LuckyStrike4life hat folgendes geschrieben:
wie soll ich dem System sagen das er nach der 19ten stelle 3 Zahlen rauslesen muss


In dem Beispiel Code den ich dir gepostet habe steht unter anderem diese Zeile:

Delphi-Quelltext
1:
If Copy (Sl[0], 12) = '10' Then begin                    

Schau dir diese mal etwas genauer an. Hier prüfe ich ob bei dem String (den ich durch Sl[0] angegeben habe) die ersten zwei Zeichen gleich 10 ist. Jetzt müsste es doch kein Problem sein die Zeile zu kopieren und so um zu schreiben das diese nun prüft ob die 3 Zeichen ab der 19. Stelle gleich 001 ist.

Gruß
Tino


LuckyStrike4life - Mi 10.09.03 14:53

Moderiert von user profile iconTino: Beitrag versehentlich gelöscht. Sorry :oops:


StefanH - Mi 10.09.03 15:47

Copy erwartet, den String, ind dem das passiert, dann wo es anfangen soll zu kopieren, und dann wieviele Zeichen es kopieren soll.

Also:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
SL := tStringList.Create; 
  Try 
    SL.LoadFromFile ('c:\test.txt'); 
     If Copy (Sl[0], 12) = '10' Then begin 
     If Copy (Sl[0], 193) = '001' then begin 
     application.terminate; 

    end
    end
  Finally 
    SL.Free; 
  end;


Verstanden?

Stefan


CenBells - Mi 10.09.03 16:34

Hallo,

Luckystrike4life will nicht überprüfen, ob die 3 zeichen ab dem 19 gleich 001 sind. Er will das einfach nur rauskopieren und dann abspeichern. Also etwa so


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
if copy(sl[0], 12) = '10' then begin
  gesuchterWert := copy(sl[0], 193);
  // jetzt kann er gesuchter wert speichern.
  // dazu auf der tabelle, oder war es das datasource append aufrufen,
  // den wert speichern mittels 
  // table.fieldbyname('wert').AsString := gesuchterWert;
  // table.post;
end;


Gruß
Ken


Tino - Mi 10.09.03 17:39

Hier der Beitrag den ich vor ca. 2 Stunden versehentlich in LuckyStrike4life´s Beitrag reingepostet habe:
Tino hat folgendes geschrieben:
Zitat:
für mich wäre es besser wenn das Programm die 3 Zeichen ab der 19ten stelle einfach kopiert, als das ich diese Abfrage.

Na dann entferne die 2. If-Then-Abfrage und pack das Ergebnis von Copy (ist ja schließlich eine Funktion die einen String zurück gibt) in einer Variable und fertig. Was du dann mit dem Wert machst, ob in einer Textdatei schreiben oder in einer Datenbank oder so, ist eine andere Frage... und somit auch ein neues Topic :-D

Gruß
Tino


LuckyStrike4life - Do 11.09.03 09:28

CenBells hat folgendes geschrieben:
Hallo,

Luckystrike4life will nicht überprüfen, ob die 3 zeichen ab dem 19 gleich 001 sind. Er will das einfach nur rauskopieren und dann abspeichern. Also etwa so


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
if copy(sl[0], 12) = '10' then begin
  gesuchterWert := copy(sl[0], 193);
  // jetzt kann er gesuchter wert speichern.
  // dazu auf der tabelle, oder war es das datasource append aufrufen,
  // den wert speichern mittels 
  // table.fieldbyname('wert').AsString := gesuchterWert;
  // table.post;
end;


Gruß
Ken


Morgen,

das hört sich doch schon sehr gut an. Es sieht jetzt so aus:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TMainForm.Button1Click(Sender: TObject);
begin
  SL := tStringList.Create;
  Try
    SL.LoadFromFile ('c:\test.txt');
     If Copy (Sl[0], 12) = '10' Then begin
     gesuchterWert := copy(sl[0], 193);
     TableMain.edit;
     TableMain.Append;
     TableMain.FieldByName('relev').AsString := gesuchterWert;
     TableMain.Post;
    end;
    end;
    end;
  Finally
    SL.Free;
  end;
end;


Aber "gesuchterWert" ist natürlich noch nicht definiert und ich weiß nicht als was ich es definieren soll.
Zitat:
[Fehler] MainFormpas.pas(37): Undefinierter Bezeichner: 'gesuchterWert'


Wenn ihr mir das noch verraten könntet ... :roll: .


JustusJonas - Do 11.09.03 09:42

Vielleicht solltest du dir lieber Mal ein Buch über Delphi durchlesen!
Ist wirklich nicht böse gemeint, jeder hat ja mal klein angefangen, aber so ganz ohne Fachliteratur ist das halt schwierig.
Zumindest sollte man doch schon wissen, wie man Variablen deklariert.
Und das ist auch genau der Fehler bei deinem Programm.
Delphi weiß ja überhaupt nicht was "gesuchterWert" eigentlich ist. Also kann es da auch nix reinschreiben.
Du musst Delphi sagen, dass es sich bei "gesuchterWert" um einen String handelt:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TMainForm.Button1Click(Sender: TObject);
var
gesuchterWert   : string;
begin 
  SL := tStringList.Create; 
  Try 
    SL.LoadFromFile ('c:\test.txt'); 
     If Copy (Sl[0], 12) = '10' Then begin 
     gesuchterWert := copy(sl[0], 193); 
     TableMain.edit; 
     TableMain.Append; 
     TableMain.FieldByName('relev').AsString := gesuchterWert; 
     TableMain.Post; 
    end
    end
    end
  Finally 
    SL.Free; 
  end
end;


Greetz


barfuesser - Do 11.09.03 09:56

Vielleicht solltet Ihr das ganze auch mal ordenlich einrücken, dann würdet Ihr nämlich feststellen, daß es ein paar end; zuviel gibt.

barfuesser


CenBells - Do 11.09.03 10:29

@luckystrike4life:
Du musst nicht edit machen, bevor du append aufrufst. Du musst dir die hilfe zu edit und append mal anschauen.

Gruß
Ken


LuckyStrike4life - Do 11.09.03 10:48

Danke! Vielen Dank!

Damit hats geklappt, endlich!

@JustusJonas

Du hast ja recht und vielleicht wirst du lachen wenn ich sage das ich Bücher darüber gelesen habe. Allerdings warns auch nur absolute Einsteiger Bücher, leider ist Delphi für mich ab Februar auch nicht mehr relevant, denn dann wechsel ich die Arbeitsstelle und zur Ausbildung gehört Delphi nicht mehr dazu. D.h. es wurde und wird mir auch nicht unterrichtet und es wird auch nicht geprüft. Ich muss jetzt nächsten Monat mit Java anfangen, da werde ich mich natürlich stärker mit befassen.

@CenBells
Verstanden, das "edit" ist nun weg.

Dieses Thread ist damit auch fast am Ende, denke ich. Es gibt nur noch eine Frage... .

Wie ist es zu realesieren das alle Zeilen abgearbeitet werden. Schon klar das ich dafür eine Schleife brauche ... allerdings ist mir nicht klar wie dies umzusetzen ist.

Musste ich nie mit Delphi oder Pascal machn, hatte das mal in C aber das ist schon ne Weile her und bringt mich an dieser Stelle wohl auch nicht weiter.

Vielleicht n bisschen Hilfe von euch ... wäre super.


CenBells - Do 11.09.03 11:02

LuckyStrike4life hat folgendes geschrieben:
@JustusJonas

Du hast ja recht und vielleicht wirst du lachen wenn ich sage das ich Bücher darüber gelesen habe. Allerdings warns auch nur absolute Einsteiger Bücher...
Wie ist es zu realesieren das alle Zeilen abgearbeitet werden. Schon klar das ich dafür eine Schleife brauche ... allerdings ist mir nicht klar wie dies umzusetzen ist.


HAllo,

also schleifen und variablen werden in jedem Einsteigerbuch behandelt :roll:
Und im Link von tino findest du auch schleifen, beispielsweise hier
http://www.marcocantu.com/EPascal/German/ch05statde.htm
ich würde dir eine for schleife empfehlen. Versuch das mal mit dem link, denn wenn du auch das nicht hinbekommst, bekommst du auch in Java dicke probleme, da schleifen so etwas wie essentielles programmierwerkzeug sind, die in allen programmiersprachen gleich funktionieren und auch fast gleich aussehen (hier ein for .. to ... do , da ein for(..;..;..){...}

Gruß
Ken


JustusJonas - Do 11.09.03 11:03

Deine Vermutung mit der Schleife war schon richtig. Am besten nimmst du dafür eine For-Schleife. In dieser Schliefe kannst du angeben, dass er die Schleife von einem bis zum anderen Wert durchlaufen soll (fällt mir gerade ein wenig schwer das verständlich auszudrücken).

auf jeden Fall musst du mit 0 beginnen und das ganze so lange machen, bis du am Ende der StringList bist!

Greetz


Tino - Do 11.09.03 11:50

Die Schleife könnte so aussehen.

Delphi-Quelltext
1:
2:
For Idx := 0 To SL.Count -1 Do
  { Hier der Code der n-mal ausgeführt werden soll }

Gruß
Tino


LuckyStrike4life - Fr 12.09.03 13:05

Tino hat folgendes geschrieben:
Die Schleife könnte so aussehen.

Delphi-Quelltext
1:
2:
For Idx := 0 To SL.Count -1 Do
  { Hier der Code der n-mal ausgeführt werden soll }

Gruß
Tino


Okay danke,

ich hab mir auch das durchgelesen, was zu Schleifen zu finden war - unter dem Link den CenBells mir ans Herz gelegt hat.

Nun sieht der Code so aus:

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:
Var
  SL: tStringList;
  gesuchterWert   : string;
  Idx : integer;

implementation

{$R *.DFM}

procedure TMainForm.Button1Click(Sender: TObject);
begin

  For Idx := 0 To SL.Count -1 Do
  SL := tStringList.Create;
  
  Try
    SL.LoadFromFile ('c:\test.txt');
     If Copy (Sl[0], 12) = '10' Then begin
     gesuchterWert := copy(sl[0], 193);
     TableMain.Append;
     TableMain.FieldByName('relev').AsString := gesuchterWert;
     TableMain.Post;
    end;
  Finally
    SL.Free;
  end;
end;


"Idx" aus

Delphi-Quelltext
1:
2:
For Idx := 0 To SL.Count -1 Do
  { Hier der Code der n-mal ausgeführt werden soll }

hab ich als integer deklariert, ich denke das ist richtig.

Das ganze läßt sich auch compilieren, aber wenn ich dann auf den Button (der die Funktionen beinhaltet) drücke, bricht Delphi mit ner Fehlermeldung ab.
Versucht das Programm eventuelle immer wieder die erste Zeile erneut abzufragen?


ErnestoChe - Fr 12.09.03 13:39

Hi,

nein, es wird bei jedem Schleifendurchlauf die StringListe erstellt. Das kann nicht gehen. Daher musst du diesen Code:


Delphi-Quelltext
1:
SL := tStringList.Create;                    


Vor der For-Schleife ausführen und den Schleifen-Code in ein begin ... end -Block packen, sonst gehört nur die erste Anweisung zum Schleifen Code.

Und da jedesmal der Idx um eins erhöht wird solltest du es auch einsetzen statt eine 0 im Index anzugeben, damit die Stringliste auch durchlaufen wird:


Delphi-Quelltext
1:
If Copy (Sl[Idx], 12) = '10' Then begin                    


MFG

- Ernesto -


Tino - Fr 12.09.03 13:42

LuckyStrike4life hat folgendes geschrieben:
hab ich als integer deklariert, ich denke das ist richtig.

Ja, das ist richtig. Allerdings würde ich die Variable Idx in der Procedure definieren und nicht als globale Variable da sie ja auch nur in der Procedure benutzt wird.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TMainForm.Button1Click(Sender: TObject); 
Var
  Idx: Integer;
begin
{...}
end;

Gruß
Tino


LuckyStrike4life - Fr 12.09.03 15:22

Okay,
danke euch.

Nun sieht der Code so aus:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
  SL := tStringList.Create;

  Try
    SL.LoadFromFile ('c:\test.txt');
    For Idx := 0 To SL.Count -1 Do
    begin

     If Copy (Sl[0], 12) = '10' Then begin
     gesuchterWert := copy(sl[0], 193);
     TableMain.Append;
     TableMain.FieldByName('relev').AsString := gesuchterWert;
     TableMain.Post;
     end;

    end;
  Finally
    SL.Free;
  end;


Jetzt läßt er sich compilieren und auch den Button kann man drücken. Allerdings wird dann (vermutlich) 14 mal die erste Zeile abgearbeitet. D.h. es landet 14 mal der Wert aus der 1. Zeile in der Datenbank. Obwohl ich mir mit dem 14 mal nicht so sicher bin.

Hab ich da noch ein Fehler eingebaut, oder etwas vergessen?


cbs - Fr 12.09.03 15:30

huhu

jo gug dir nochma an was ErnestoChe geschrieben hat

ErnestoChe hat folgendes geschrieben:
Und da jedesmal der Idx um eins erhöht wird solltest du es auch einsetzen statt eine 0 im Index anzugeben, damit die Stringliste auch durchlaufen wird:


Delphi-Quelltext
1:
If Copy (Sl[Idx], 12) = '10' Then begin                    


StefanH - Fr 12.09.03 15:31

Na klar!
wenn du 14 mal in der ersten Zeile guckst:

If Copy (Sl[0], 1, 2) = '10'

Da muss dein Schleifenzähler rein!!

Stefan
//Edit: zu langsam :(


LuckyStrike4life - Fr 12.09.03 16:22

Stimmt,

hatte ich vergessen. Hatte ich aber auch schon nachgeholt. Brachte leider nicht viel, hm... .

Noch n Fehler drin?


CenBells - Fr 12.09.03 17:56

hallo,

hast du auch bei der zuweisung von gesuchter wert den schleifenzähler reingemacht?


Delphi-Quelltext
1:
gesuchterWert := copy(sl[idx], 193);                    


Gruß
Ken


LuckyStrike4life - Mo 22.09.03 09:47

CenBells hat folgendes geschrieben:
hallo,

hast du auch bei der zuweisung von gesuchter wert den schleifenzähler reingemacht?


Delphi-Quelltext
1:
gesuchterWert := copy(sl[idx], 193);                    


Gruß
Ken


Hey,

schönen Dank - daran hats gelegen. Endlich gehts so wie es soll!

Nochmals Danke!! an alle die mir geholfen haben - ihr werdet sicher noch öfters die Chance dazu haben :) .


LuckyStrike4life - Mo 22.09.03 09:54

Um es schnell komplett zu machen - für Leute die n ähnliches Problem haben, hier der Code:

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 TMainForm.Button1Click(Sender: TObject);
begin

  
  SL := tStringList.Create;

  Try
    SL.LoadFromFile ('c:\file.txt');
    For Idx := 0 To SL.Count -1 Do
    begin

     If Copy (Sl[Idx], 12) = '10' Then begin
     gesuchterWert := copy(sl[idx], 193);
     TableMain.Append;
     TableMain.FieldByName('relev').AsString := gesuchterWert;
     TableMain.Post;
     end;

    end;
  Finally
    SL.Free;
  end;
end;