Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Fehlermeldung E2010 bei simpler Stringoperation?


Kay E. - Di 10.05.11 14:38
Titel: Fehlermeldung E2010 bei simpler Stringoperation?
Hallo!

Es geht um folgenden 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:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
//Checks whether the program was finished successful last time it was used or
//not; if not, user will be asked if he wants to store the old ProgLog; if yes
//Proglog will be renamed
//Procedure is called before a new Proglog is started
procedure CheckLastTimeSuccessful;
var
  vProgLog: File of Ansichar;
  vStr: string;
  vNewName: string;
  vByte: ansichar;
  vCount: Integer;
begin
  if FileExists(SysData.ProgLogName) then
  begin
    AssignFile(vProgLog, SysData.ProgLogName);
    try
      try
        reset(vProgLog);
        seek(vProglog, Filesize(vProgLog) - 3);
        BlockRead(vProgLog, vByte, 1);
      except
        MessageDlg('Error occured opening ProgLog-File. Make a Backup, delete' +
          ' it and restart the program.', mtError, [mbClose], 0, mbClose);
        Application.Terminate;
      end;
    finally
      Closefile(vProgLog);
    end;

    if vByte <> '~' then
    begin
      if MessageDlg('Program crasht last time. Do you want to keep a backup ' +
        'of the program Logfile?', mtInformation, [mbYes, mbNo], 0, mbYes)
        = mrYes then
      begin
        vStr := Delete(SysData.ProgLogName, Length(SysData.ProgLogName) - 34);
        for vCount := 1 to High(Integer) do
        begin
          vNewName := vStr + '_Bkp' + inttostr(vCount) + '.log';
          if not FileExists(vStr) then
          begin
            if RenameFile(SysData.ProgLogName, vStr) then
            begin
              break;
            end;
          end;
        end;
      end;
    end;
  end;
end;


Was der Code macht, steht ja eigentlich schon da.
Im ProgrammLog wird bei erfolgreicher Beendigung '~'#13#10 geschrieben. Ich prüfe auf die Tilde, ob das Programm abgestürzt ist. Wenn ja, wird auf Wunsch das Log umbenannt.
Das Proglog ist ein Textfile. SysData.ProglogName ist ein string[255].
Der Fehler E2010 Inkompatible Typen: 'string' und 'procedure, untyped pointer or untyped parameter' tritt in der Zeile auf, in der ich mit Delete die letzten vier zeichen des Namens (also die Extension) löschen möchte.
Was ist da los?

Oder hat jemand eine bessere Lösung, wie ich die letzte Zeile eines u.U. bis zu 1,6 GB großen Textfiles Zeitschonend (ReadLn bis EOF geht also nicht) auslesen kann?

Danke schonmal!

Grüße Kay


Gammatester - Di 10.05.11 15:54

Delphihilfe schreibt: procedure Delete(var S: string; Index, Count:Integer). Also

Delphi-Quelltext
1:
2:
vStr := SysData.ProgLogName;
Delete(vStr, Length(vStr) - 34);
oder

Delphi-Quelltext
1:
vStr := copy(SysData.ProgLogName, 1, Length(SysData.ProgLogName) - 4);                    


Kay E. - Di 10.05.11 16:23

Oh mann :shock:
Manchmal sieht man den Wald vor lauter Bäumen nicht mehr. Das ist ja schon richtig peinlich, v.a. wenn ich bedenke, dass ich da über ne halbe Stunde den Fehler nicht gefunden hab :oops:

Vielen lieben Dank!