Die aktuelle Zeile kannst du farbig markieren, in dem du die Eigenschaft "ActiveLineColor" des SynEdit änderst.
Die roten Markierungen zeichnen ich selber auf das Canvas.
Zu dem Auslesen der Werte, hier mal eine Funktion, wird zwar nicht die beste sein, aber als Denksanstoss bestimmt geignet:
Delphi-Quellcode:
function GetItem(const AData: TStrings; const ARoom, AItem: String): String;
var
i, j, k,
fPos,
fOpenStart: Integer;
fLine: String;
fFinish,
fOpen: Boolean;
begin
Result := '';
//nach der Position des Raums suchen
for i := 0 to AData.Count - 1 do
begin
if Pos(ARoom, AData[i]) > 0 then
if Pos('Raum', AData[i]) = 1 then
begin
fPos := i;
Break;
end;
end;
//Attribut auslesen
fFinish := False;
fOpen := False;
for i := fPos to AData.Count - 1 do
begin
if Pos(AItem, AData[i]) = 1 then
begin
fLine := AData[i];
//Wert abtrennen
for j := Pos(' ', fLine) to Length(fLine) do
begin
if fLine[j] <> ' ' then
begin
for k := j to Length(fLine) do
Result := Result + fLine[k];
Break;
end;
end;
//prüfen, ob der String vollständig ist
if Result[1] = '''' then
begin
fOpen := True;
fOpenStart := i;
//Anführungszeichen entfernen
Delete(Result, 1, 1);
end else
fFinish := True;
end;
if fOpen then
begin
if fOpenStart = i then
Continue;
fLine := AData[i];
if fLine = '' then
Continue;
//Wert abtrennen
for j := Pos(' ', fLine) to Length(fLine) do
begin
if fLine[j] <> ' ' then
begin
for k := j to Length(fLine) do
Result := Result + fLine[k];
Break;
end;
end;
if Result[Length(Result)] = '''' then
begin
fOpen := False;
fFinish := True;
Delete(Result, Length(Result), 1);
end;
end;
if fFinish then
Break;
end;
Hier noch ein Beispiel zur Verwendung. Anstatt die Datei zu laden, kannst du als AData auch bspw. die Lines eines Memos oder so angeben, je nach dem was da auf dem Screenshot ist, weiß ja nicht wo du es brauchst:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
//Stringliste zum speichern der Daten
fData: TStrings;
begin
//Instanz anlegen
fData := TStringList.Create;
try
//Liste laden
fData.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'Karn.adv.txt');
//Wert "Std" von "Eingang" auslesen
Edit1.Text := GetItem(fData, 'Eingang', 'Std');
//wert "Besch" von Eingang" auslesen
Memo1.Text := GetItem(fData, 'Eingang', 'Besch');
finally
//Liste wieder freigeben
fData.Free;
end;
end;