Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi DRPQMAT-Datei bearbeiten (TXT-Datei auslesen) (https://www.delphipraxis.net/18665-drpqmat-datei-bearbeiten-txt-datei-auslesen.html)

DRPEnc 23. Mär 2004 12:39

Re: DRPQMAT-Datei bearbeiten (TXT-Datei auslesen)
 
@ Robert_G: Schönes Foto!

Hab aber bei mir noch ein paar Probleme Deinen Code einzubauen.
Er meckert bei PosEx und Grind.

Hier ist mein Ansatz, denke aber, dass diese komplett falsch ist:

Delphi-Quellcode:
unit MatGrind;

interface

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

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    GroupBox1: TGroupBox;
    GroupBox2: TGroupBox;
    StringGrid2: TStringGrid;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}



procedure TForm1.Button1Click(Sender: TObject);
Var
  X, Y, ActPos, PrevPos                : Integer;
  sl                                   : TStrings;
Begin
  If Not OpenDialog1.Execute Then Exit;
  sl := TStringList.Create;
  Try
    // Öffne Datei in StringList
    sl.LoadFromFile(OpenDialog1.FileName);
    // laufe durch die sl
    For Y := 0 To pred(sl.Count) Do
    Begin
      // Spalte 0
      X := 0;

      PrevPos := 1;
      // suche das erste ","
      ActPos := PosEx(',', Sl[Y], PrevPos);
      // verlasse die Schleife wenn kein "," mehr gefunden wurde
      While ActPos > 0 Do
      Begin
        // schreibe in die Zelle den Text zwischen dem vorherigen "," und dem gefundenen ","
        Grid.Cells[X, Y] := Copy(sl[Y], PrevPos, (ActPos - PrevPos));
        // Postion des letzten Kommas
        PrevPos := succ(ActPos);
        // suche das nächste ","
        ActPos := PosEx(',', Sl[Y], PrevPos);
        inc(X);
      End;
      // zum Schluss noch den Text ab dem zuletzt gefundenen Komma in die Zelle
      Grid.Cells[X, Y] := Copy(sl[Y], PrevPos, Length(sl[Y]));

    End;
  Finally
    // Freigeben der sl
    FreeAndNil(SL);
  End;
End;

procedure TForm1.Button2Click(Sender: TObject);
Var
  X, Y                                 : Integer;
  sl                                   : TStrings;
  TempStr                              : String;
Begin
  If Not SaveDialog1.Execute Then Exit;
  sl := TStringList.Create;
  Try
    With Grid Do
      For Y := 0 To pred(Grid.RowCount) Do
      Begin
        // Leeren des TempStr vor jeder Zeile
        TempStr := '';
        For X := 0 To pred(Grid.ColCount) Do
          TempStr := TempStr + Trim(Cells[X, Y]) + ',';

        // Hinzufügen von TempStr zur sl
        // in der letzten Zeile muss das letzte Komma abgeschnitten werden
        If Y = pred(Grid.RowCount) Then
          sl.Add(Copy(TempStr, 1, Length(TempStr) - 1))
        Else
          sl.Add(TempStr);
      End;

    // Speichern der StringList
    sl.SaveToFile(SaveDialog1.FileName);
  Finally
    // Freigeben der sl
    FreeAndNil(SL);
  End;
End;

end.

Robert_G 23. Mär 2004 12:46

Re: DRPQMAT-Datei bearbeiten (TXT-Datei auslesen)
 
Zitat:

Zitat von Robert_G
Suche mal in der OH nach POSEX (liegt in der Unit StrUtils).

:mrgreen:

DRPEnc 23. Mär 2004 13:17

Re: DRPQMAT-Datei bearbeiten (TXT-Datei auslesen)
 
Werd ich machen ...

DRPEnc 23. Mär 2004 13:20

Re: DRPQMAT-Datei bearbeiten (TXT-Datei auslesen)
 
Code:
Returns the index value of a substring.

Unit

StrUtils

Category

string handling routines

Delphi syntax:

function PosEx(const SubStr, S: string; Offset: Cardinal = 1): Integer;

C++ syntax:

extern PACKAGE int __fastcall PosEx(const AnsiString SubStr, const AnsiString S, unsigned Offset = 1);

Description

PosEx returns the index of SubStr in S, beginning the search at Offset. If Offset is 1 (default), PosEx is equivalent to Pos.

PosEx returns 0 if SubStr is not found, if Offset is greater than the length of S, or if Offset is less than 1.
Das hab ich gefunden. Nur wenn ich Deinen Code einbinde meckert Delphi wegen dem OpenDialog1. Wieso eigentlich?

DRPEnc 23. Mär 2004 13:25

Re: DRPQMAT-Datei bearbeiten (TXT-Datei auslesen)
 
Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
begin
Close;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
If Not OpenDialog1.Execute Then Exit;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
If Not SaveDialog1.Execute Then Exit;
end;

function PosEx(const SubStr, S: string; Offset: Cardinal = 1): Integer;
 begin
 //
 end;
Procedure load_Grid(Grid: TStringGrid);
Var
  X, Y, ActPos, PrevPos                : Integer;
  sl                                   : TStrings;
Begin
  //If Not OpenDialog1.Execute Then Exit;
  sl := TStringList.Create;
  Try
    // Öffne Datei in StringList
    //sl.LoadFromFile(OpenDialog1.FileName);
    // laufe durch die sl
    For Y := 0 To pred(sl.Count) Do
    Begin
      // Spalte 0
      X := 0;

      PrevPos := 1;
      // suche das erste ","
      ActPos := PosEx(',', Sl[Y], PrevPos);
      // verlasse die Schleife wenn kein "," mehr gefunden wurde
      While ActPos > 0 Do
      Begin
        // schreibe in die Zelle den Text zwischen dem vorherigen "," und dem gefundenen ","
        Grid.Cells[X, Y] := Copy(sl[Y], PrevPos, (ActPos - PrevPos));
        // Postion des letzten Kommas
        PrevPos := succ(ActPos);
        // suche das nächste ","
        ActPos := PosEx(',', Sl[Y], PrevPos);
        inc(X);
      End;
      // zum Schluss noch den Text ab dem zuletzt gefundenen Komma in die Zelle
      Grid.Cells[X, Y] := Copy(sl[Y], PrevPos, Length(sl[Y]));

    End;
  Finally
    // Freigeben der sl
    FreeAndNil(SL);
  End;
End;

Procedure save_Grid(Grid: TStringGrid);
Var
  X, Y                                 : Integer;
  sl                                   : TStrings;
  TempStr                              : String;
Begin
  //If Not SaveDialog1.Execute Then Exit;
  sl := TStringList.Create;
  Try
    With Grid Do
      For Y := 0 To pred(Grid.RowCount) Do
      Begin
        // Leeren des TempStr vor jeder Zeile
        TempStr := '';
        For X := 0 To pred(Grid.ColCount) Do
          TempStr := TempStr + Trim(Cells[X, Y]) + ',';

        // Hinzufügen von TempStr zur sl
        // in der letzten Zeile muss das letzte Komma abgeschnitten werden
        If Y = pred(Grid.RowCount) Then
          sl.Add(Copy(TempStr, 1, Length(TempStr) - 1))
        Else
          sl.Add(TempStr);
      End;

    // Speichern der StringList
    //sl.SaveToFile(SaveDialog1.FileName);
  Finally
    // Freigeben der sl
    FreeAndNil(SL);
  End;
End;


end.
Nun hab ich zwar keinen Fehler mehr, aber die Function ist ohne Function... Desweiteren musste ich die Load und Savefunctionen ausschalten. Irgendwie bekomme ich die Produce load/save_Grind nicht in mein Brain.
Kannst Du mir ein Bespiel posten?

DRPEnc 23. Mär 2004 13:50

Re: DRPQMAT-Datei bearbeiten (TXT-Datei auslesen)
 
Delphi-Quellcode:
function PosEx(Substr: string; S: string; P: Integer): Integer;
begin
  if P <= 0 then Result := 0
  else Result := Pos(Substr, Copy(S, P, Length(S)));
  if Result <> 0 then Result := Result + P - 1;
end;
Die komplette Function hab ich jetzt gefunden. Nur wie bring ich load/save_Grind die Open/Save Dialoge bei?

Robert_G 23. Mär 2004 14:03

Re: DRPQMAT-Datei bearbeiten (TXT-Datei auslesen)
 
Indem du sie einfach auf's Form ziehst.

DRPEnc 23. Mär 2004 14:20

Re: DRPQMAT-Datei bearbeiten (TXT-Datei auslesen)
 
Liste der Anhänge anzeigen (Anzahl: 1)
K, nochmal von vorne.

So bin ich vorgegangen:

Neue Application erstellt.
Zwei groupboxes mit titel 'Intra Matrix:' und 'Inter Matrix:' erstellt.
Dort hinein jeweils eine StringGrind.
Fünf Buttons erstellt. Auf jeden doppelgeklickt.
Zwei Open und zwei SaveDialoge auf die Form geklatscht.
Diese mit den Save und Load Buttons verknüpft.
Die anderen mit // dummies ausgestattet.
PosEx Function in den Quellcode kopiert.
Deinen Quellcode hineinkopiert.

Resultat:

Findet die Save und Load Dialoge nicht.
Wenn ich die jeweiligen Zeilen in Deinem Code deactiviere kann ichs compilen.

Kannst Du mir nun sagen, wo ich was falschgemacht habe? Weil irgendwie tut das ganze :wall: schon weh...

Robert_G 23. Mär 2004 14:22

Re: DRPQMAT-Datei bearbeiten (TXT-Datei auslesen)
 
Kannst du .rar oder .zip archive anhängen? Ich kriege von selbstentpackenden immer Ausschlag. :?

Robert_G 23. Mär 2004 14:31

Re: DRPQMAT-Datei bearbeiten (TXT-Datei auslesen)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Du brauchst nur einen SaveDialg & einen OpenDialog!
Ich habe sie bei mir einfach SaveDialog1 & OpenDialog1 genannt, du kannst doch den Code soweit anpassen, oder nicht?

Edit: ich habe dir das Projekt angehängt.
Falls du dich mit den beiden Dialogen nicht auskennst, schau dir mal im OI die Einstellungen Filter, FilterIndex & DefaultExt an (natürlich auch in der OH :wink: ). Schaden kann's nix...


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:16 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz