Einzelnen Beitrag anzeigen

Popov
(Gast)

n/a Beiträge
 
#9

AW: inhalt an bestimmter position im memo auslesen, verändern und wieder abspeichern

  Alt 16. Jun 2012, 16:04
@Lulle

In hab in der Zwischenzeit das Beispiel in Funktionen zerlegt, da man es gelegentlich braucht:

Delphi-Quellcode:
function CellsInCsvLine(AText: String; ADelimiter: Char): Word;
begin
  with TStringList.Create do
  try
    Delimiter := ADelimiter;
    DelimitedText := AText;
    Result := Count;
  finally
    Free
  end;
end;

function ReadCsvLineCell(AText: String; ADelimiter: Char; Col: Word; var
  Value: String): Boolean;
begin
  Value := '';
  with TStringList.Create do
  try
    Delimiter := ADelimiter;
    DelimitedText := AText;
    Result := (Col <= Count) and (Col > 0);
    if Result then
      Value := Strings[Col - 1];
  finally
    Free
  end;
end;

function ReplaceCsvLineCell(var AText: String; ADelimiter: Char; Col: Word;
  Value: String): Boolean;
begin
  with TStringList.Create do
  try
    Delimiter := ADelimiter;
    DelimitedText := AText;
    Result := (Col <= Count) and (Col > 0);
    if Result then
    begin
      Strings[Col - 1] := Value;
      AText := DelimitedText;
    end;
  finally Free end;
end;

procedure WriteCsvLineCell(var AText: String; ADelimiter: Char; Col: Word;
  Value: String);
begin
  with TStringList.Create do
  try
    if Col <= 0 then Exit;
    Delimiter := ADelimiter;
    DelimitedText := AText;
    while Col > Count do
      Add('');
    Strings[Col - 1] := Value;
    AText := DelimitedText;
  finally Free end;
end;
Parameter:
Code:
AText ist eine Zeile aus der Csv Tabelle
ADelimiter das Trennzeichen
Col die Spalte
Value der Wert der Spalte
Beispiele:
Delphi-Quellcode:
var
  sText, Value: String;
begin
  if ReadCsvLineCell(Memo1.Lines[0], ' ', 4, Value) then
    ShowMessage(Value) else
    ShowMessage('#Fehler#1');

  sText := Memo1.Lines[0];
  Value := '24';
  if ReplaceCsvLineCell(sText, ' ', 4, Value) then
    Memo1.Lines[0] := sText else
    ShowMessage('#Fehler#2');

  {sText := Memo1.Lines[0];
  Value := '24';
  WriteCsvLineCell(sText, ' ', 10,  Value);
  Memo1.Lines[0] := sText;}


  ShowMessage(IntToStr(CellsInCsvLine(Memo1.Lines[0], ' ')));
end;
CellsInCsvLine gibt die Anzahl der Spalten
ReadCsvLineCell liest eine Zelle aus, gibt False zurück wenn Zelle nicht vorhanden
ReplaceCsvLineCell ersetzt eine Zelle, gibt False zurück wenn Zelle nicht vorhanden
WriteCsvLineCell wie Replace, wenn Zelle fehlt, wird die Zeile um die Anzahl Spalten erweitert

//Edit:

Ich hab den Code gerade vereinfacht, da ich ihn vorher aus einem alten Delphi 3 Code kopiert habe und es da noch kein DelimitedText gab. Hier jetzt also die moderne Version, allerdings erst ab Delphi 6.

Geändert von Popov (16. Jun 2012 um 21:28 Uhr) Grund: Fehler beseitig
  Mit Zitat antworten Zitat