![]() |
inhalt an bestimmter position im memo auslesen, verändern und wieder abspeichern
hallo,
ich bin ganz neu hier und habe folgendes problem: ich habe ein memo, dessen inhalt beispielsweise so aussieht: abc def ghi 25 jkl cba fed ihg 19 lkj (die einzelnen wörter, beziehungsweise zahlen sind jeweils mit zwei tabs voneinander getrennt) so. nun möchte ich die zahl "25" oder auch die "19" auslesen, die zahl um den wert 1 veringern, und anschließend wieder in das memo abspeichern. wie kann ich das am besten bewerkstelligen? ich hab schon alles abgesucht aber keine möglichkeit dafür gefunden. danke im vorraus gruß lulle |
AW: inhalt an bestimmter position im memo auslesen, verändern und wieder abspeichern
Sieht nach normalem Text-Ersetzen in Memo aus.
Guck dir StringReplace an. |
AW: inhalt an bestimmter position im memo auslesen, verändern und wieder abspeichern
naja ich will ja nicht den string "25" auslesen und mit "24" ersetzen, sondern ich will im memo eine bestimmte zeile und eine eine bestimmte spalte ansteuern(sofern man eine "spalte" im memo überhaupt ansteuern kann), den gefundenen wert(ist immer eine zahl, da in dieser spalte ausschließlich zahlen stehen) um den wert 1 verringern und dann wieder an genau der stelle im memo abspeichern.
ich vermute, dass ich dazu zwei befehle brauche, also erstmal einen mit dem ich den gewünschten string auslese und dann nochmal einen befehl, mit dem ich den neuen string an die gewünschte stelle einsetze. ich hoffe das problem ist jetzt deutlicher geworden gruß lulle |
AW: inhalt an bestimmter position im memo auslesen, verändern und wieder abspeichern
Hallo und Willkommen in der DP :dp:,
Du solltest das Problem in kleinere Teilprobleme zerlegen: - Postition der Zahl innerhalb der Zeile ermitteln - Zahl auslesen - neue Zahl berechnen - an ermittelter Postition einfügen Das Ganze geschieht dann zeilenweise in einer Schleife über die TMemo.Lines. |
AW: inhalt an bestimmter position im memo auslesen, verändern und wieder abspeichern
Arbeiten wir doch zuerst an der Problembeschreibung:
- du lädst in eine Memo eine CSV-Tabelle. Sie besteht aus mit Tab getrennten Spalten. - Eine der Spalten enthält Zahlenwerte. Diese Zahlenwerte sollen verändert werden. Habe ich das korrekt verstanden? //Edit: Sollte ich es richtig verstanden haben, kann ich seit einer halben Stunde eine einfache Lösung anbieten. Wenn keine Antwort kommt, gehe ich davon aus, dass ich es falsch verstanden habe. |
AW: inhalt an bestimmter position im memo auslesen, verändern und wieder abspeichern
Wesentlich ist hier die Trennung von Datenmodell und Darstellung: Das Memo ist keine Datenstruktur, sondern eine Form der Visualisierung.
Die Verarbeitung von DelimitedText geschieht wohl immer noch mit TStringList oder etwas vergleichbarem. Und dazu gibt es auch sicher zwei Beispiele, wenn man nach CSV oder DelimitedText sucht. Grüße vom marabu |
AW: inhalt an bestimmter position im memo auslesen, verändern und wieder abspeichern
@ popov,
jo du hast es im prinzip richtig verstanden, deine einfache lösung würde ich gerne sehen. |
AW: inhalt an bestimmter position im memo auslesen, verändern und wieder abspeichern
Suche doch einfach nach den Stichworten, die Achim dir vorgegeben hat.
Eine Stringliste besitzt die Eigenschaft .DelimitedText, durch Zuweisung eines Strings wird dieser dann, anhand des in der Eigenschaft .Delimiter festgelegten Trenners, getrennt. |
AW: inhalt an bestimmter position im memo auslesen, verändern und wieder abspeichern
@Lulle
In hab in der Zwischenzeit das Beispiel in Funktionen zerlegt, da man es gelegentlich braucht:
Delphi-Quellcode:
Parameter:
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;
Code:
Beispiele:
AText ist eine Zeile aus der Csv Tabelle
ADelimiter das Trennzeichen Col die Spalte Value der Wert der Spalte
Delphi-Quellcode:
CellsInCsvLine gibt die Anzahl der Spalten
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; 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. |
AW: inhalt an bestimmter position im memo auslesen, verändern und wieder abspeichern
wow das sieht ja ziemlich stark aus.
ich versuch mal das alles nachzuvollziehen und probier's dann mal aus. danke für die schnelle hilfe |
AW: inhalt an bestimmter position im memo auslesen, verändern und wieder abspeichern
Warum überall der Datentyp Word und nicht Integer?
|
AW: inhalt an bestimmter position im memo auslesen, verändern und wieder abspeichern
a.) aus Prinzip, da keine negativen Zahlen
b.) ich die Funktionen zwei mal optimiert habe und es zuerst bei Null anfing, es zuerst also eine natürliche Einschränkung war c.) gerade vorhin einen Fehler entdeckt habe und noch Col > 0 einbaute, was die natürliche Einschränkung obsolet machte Aber sag ruhig wieso Integer besser ist. |
AW: inhalt an bestimmter position im memo auslesen, verändern und wieder abspeichern
Vor XE2 hätte ich gesagt, weil er "mitwächst". Leider hat man das mit Xe2 aber geändert. Aber nach deiner Definition wäre dann cardinal der Beste Typ.
Ab XE2 wäre dass dann NativeUInt |
AW: inhalt an bestimmter position im memo auslesen, verändern und wieder abspeichern
Also wenn einer bei einer Csv Tabelle mehr als 65535 Spalten nutzt, dem ist nicht zu helfen. Somit reicht Word.
Wenn aber Integer oder Cardinal vom System besser verarbeitet werden kann, dann werde ich es zukünftig evtl. auch so handhaben. Allerdings nur aus Prinzip, da bei so einen einfachen Aufgabe es wohl nichts ausmacht. |
AW: inhalt an bestimmter position im memo auslesen, verändern und wieder abspeichern
so. ich hab jetzt alles hinbekommen, musste noch n paar veränderungen vornehmen, dass alles auf meinen speziellen fall zugeschnitten ist, aber jetzt läufts.
großen dank an popov gruß lulle |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:15 Uhr. |
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 by Thomas Breitkreuz