[Delphi] Błąd z zapisem (lub odczytem) z INI


(Krzyuis) #1

Witam

Mam problem w delphi i nie wiem gdzie jest bład. Otóż piszę program do monitorowania schowka i zapisywaniu przechwyconego tekstu do pliku INI. Wszystko działało dobrze, dopóki nie zaczałem się męczyć z usuwaniem przechwyconego tekstu z tabeli. Usuwanie mi działa, ale chyba mam coś z zapisem lub wstawianiem do tabeli. Usunę jakiś element, uruchomie ponownie program, i dalej mam ten element, który usunałem, a nie mam innego, którego nie usuwałem. Co gorsza jeśli usune coś, co jest na poczatku lub na końcu listy, po ponownym uruchomieniu to dalej jest na liście.

Na formie mam 3 komponenty:

Timer: TTimer;

Tabela: TListBox;

Usun: TButton;

oto kod

unit Rcode;


interface


uses

  Windows, Messages, SysUtils, Variants, Graphics, Controls, Forms,

  Dialogs, StdCtrls, ExtCtrls, ClipBrd, Classes, INIFiles, StrUtils;


type

  TMainForm = class(TForm)

    Timer: TTimer;

    Tabela: TListBox;

    Usun: TButton;

    procedure TimerTimer(Sender: TObject);

    procedure FormCreate(Sender: TObject);

    procedure UsunClick(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;


var

  MainForm: TMainForm;

  Z1, Z2: String;

  sciezka: ShortString;

  i, i2, i3, i4, i5, i6: integer;

  INI: TIniFile;

  zapisItem, odczytItem: string;

  Tablica: array[1..1000000] of string;

  odczytIteracji: string;

  wskaznikOdczytu: Integer;


implementation


{$R *.dfm}


procedure TMainForm.TimerTimer(Sender: TObject);

begin

  Z2 := Clipboard.AsText;

  if Z2 <> Z1 then

  begin

    i := i + 1;

    Z1 := Clipboard.AsText;

    Tabela.items.Add(Z1);

    Tablica[i] := Z1;

  end;

end;


procedure TMainForm.FormCreate(Sender: TObject);

begin

  if FileExists(ExtractFilePath(Application.ExeName) + 'setup.ini') then

  begin

    for i4 := 1 to wskaznikOdczytu do

    begin

      if Tablica[i4] <> '' then

      Tabela.Items.Add(Tablica[i4]);

    end;

  end;

  Z1 := Clipboard.AsText;

end;


procedure TMainForm.UsunClick(Sender: TObject);

begin

  try

    for i5 := 0 to 1000000 do

    begin

      if Tabela.Selected[i5] = true then

      begin

        Tabela.Items.Delete(i5);

        Tablica[i5] := '';

      end;

    end;

  except


  end;

end;


initialization

  if FileExists(ExtractFilePath(Application.ExeName) + 'setup.ini') then

  begin

    sciezka := ExtractFilePath(Application.ExeName);

    INI := TINIFile.Create(sciezka + 'setup.ini');

    odczytIteracji := INI.ReadString('Setup', 'i2', '1000000');

    wskaznikOdczytu := StrToInt(odczytIteracji);

    wskaznikOdczytu := wskaznikOdczytu - 1;

    try

      for i3 := 1 to wskaznikOdczytu do

      begin

        i := i + 1;

        odczytItem := INI.ReadString('Koordynaty', IntToStr(i3), 'brak');

        Tablica[i3] := odczytItem;

      end;

    finally

      INI.Free;

    end;

  end;


finalization

  sciezka := ExtractFilePath(Application.ExeName);

  INI := TINIFile.Create(sciezka + 'setup.ini');

  try

    for i2 := 1 to i do

    begin

      zapisItem := Tablica[i2];

      INI.WriteString('Koordynaty', IntToStr(i2), zapisItem);

    end;

    INI.WriteString('Setup', 'i2', IntToStr(i2));

  finally

    INI.Free;

  end;


end.

([alex]) #2

Timer nie potrzebujesz.

//W klasie:

    CbChain:THandle;

    procedure WmChangeCbChain(var Msg:TWMChangeCBChain);message WM_CHANGECBCHAIN;

    procedure WmDrawClipboard(var Msg:TWMDrawClipboard);message WM_DRAWCLIPBOARD;

//w FormCreate:

  CbChain:=SetClipboardViewer(Handle);

//w FormDestroy:

  ChangeClipboardChain(Handle,CbChain);

//w implementation:

procedure TMainForm.WmChangeCbChain(var Msg:TWMChangeCBChain);//message WM_CHANGECBCHAIN;

begin

  if CbChain=Msg.Remove then

  begin

    CbChain:=Msg.Next;

    Msg.Result:=0;

  end

  else Msg.Result:=SendMessage(CbChain,WM_CHANGECBCHAIN,Msg.Remove,Msg.Next);

end;


procedure TMainForm.WmDrawClipboard(var Msg:TWMDrawClipboard);//message WM_DRAWCLIPBOARD;

var S:String;

begin

  S:=Clipboard.AsText;

  ...

  SendMessage(CbChain,WM_DRAWCLIPBOARD,0,0);

end;

Owszem niby trochę więcej kodu zaś program nie zamula procesora.

//zamiast:
    for i5 := 0 to 1000000 do
    begin
      if Tabela.Selected[i5] = true then
    ...
//użyj:
    Tabela.Items.Delete(Tabela.ItemIndex); [/code]

Nie pojmuje “dlaczemu” używasz zmiennych globalnych skoro ich nie potrzebujesz.

Nie widzę u ciebie żadnego kasowania czegokolwiek z pliku INI.


(Monczkin) #3

GoogleError , nazwij temat konkretnie i bez zbędnych problemów w nazwie. Inaczej wyciągnę konsekwencje. Przeczytaj ten temat.

viewtopic.php?f=16&t=394978