[ stameni @ 03.07.2025. 18:12 ] @
Na formu sam stavio ClientDataSet, DataSource i DBGrid komponente, i popunio odgovarajuće propertyje. Na formi sam prilkom dizajniranja imao vidljiv DBGrid, koji sam nekako (ne sećam se tačno kako) disableovao.

Ideja mi je bila da se prilikom pokretanja aplikacije i ne pojavljuje DBGrid, već onda kada korisnik klikne na "New" ili na "Open". Uspešno sam rešio to design-time, ali mi sada run-time ne radi. Mora da sam negde nešto pogrešio prilikom dizajniranja forme.

Evo nekoliko kritičnih linija.

Code:

procedure TMainForm.FileNewClick(Sender: TObject);
var
  s: String;
begin
  s := ParamStr(0);
  s := ExtractFilePath(s);
  s := s + 'New.cds';
  cds.FileName := s;
  cds.Insert;
  cds.Fields[0].AsInteger := 10;
  cds.Fields[1].AsString := 'abcd';
  cds.Fields[2].AsInteger := 12;
  cds.Fields[3].AsFloat := 12.12;
  cds.Fields[4].AsFloat := 122.24;
  cds.Active := true;
end;

procedure TMainForm.FileOpenClick(Sender: TObject);
var
  s: String;
begin
  s := ParamStr(0);
  s := ExtractFilePath(s);
  OpenDialog1.InitialDir := s;
  if OpenDialog1.Execute then
    cds.LoadFromFile(OpenDialog1.FileName);
  cds.Active;
end;


BTW, program upisuje u bazu (vidim da baza raste), ali nikako da se vidi DBGrid.
[ stameni @ 04.07.2025. 17:10 ] @
Novi i mnogo važniji problem: nikako ne mogu da izmenim podatak u postojećoj bazi. Evo koda:

Code:

procedure TForm1.Button1Click(Sender: TObject);
begin
  cds.Open; { cds je TClientDataSet }
  cds.First;
  while not cds.Eof do
    begin
      cds.Fields[1].AsString := 'upis u bazu'; { * }
      cds.Next;
    end;
  cds.Close;
end;


Pukne kod reda sa zvezdicom, uz run-time poruku "cds: Dataset not in edit or inser mode".

Nešto je siiitno, ali ja na ovu vrućinu ne shvatam šta...

A pokušavao sam na mnooogo načina da otvorim bazu, ali -- jok, uvek pukne kod upisa. S druge strane, čitanje radi savršeno.
[ iculibrk @ 04.07.2025. 17:45 ] @
Možda pre
Code:
cds.Fields[1].AsString := 'upis u bazu'; { * }
staviti
Code:
cds.Edit
a posle
Code:
cds.Post


Za problem iz prvog posta možda ovako:
Code:
procedure TMainForm.FileNewClick(Sender: TObject);
var
  s: String;
begin
  s := ParamStr(0);
  s := ExtractFilePath(s);
  s := s + 'New.cds';
  cds.FileName := s;
  cds.Insert;
  cds.Fields[0].AsInteger := 10;
  cds.Fields[1].AsString := 'abcd';
  cds.Fields[2].AsInteger := 12;
  cds.Fields[3].AsFloat := 12.12;
  cds.Fields[4].AsFloat := 122.24;
  cds.Active := True;

  DBGrid1.Visible := True;
end;

procedure TMainForm.FileOpenClick(Sender: TObject);
var
  s: String;
begin
  s := ParamStr(0);
  s := ExtractFilePath(s);
  OpenDialog1.InitialDir := s;
  if OpenDialog1.Execute then
  begin
    cds.LoadFromFile(OpenDialog1.FileName);
    cds.Active := True;
    DBGrid1.Visible := True;
  end;
end;


Po meni nedostaje
Code:
DBGrid1.Visible := True;


[Ovu poruku je menjao iculibrk dana 04.07.2025. u 19:10 GMT+1]
[ stameni @ 04.07.2025. 21:29 ] @
Bio si u pravu oko oba Mnogo hvala

Izgubio sam sate i sate pokušavajući sam da izguglam rešenje... a pretpostavljao sam da je tako "jevtino"
[ stameni @ 05.07.2025. 16:37 ] @
Ako može još malo pomoći...

Potreban mi je neki event na koji bih mogao da se "zakačim" kada god se napusti polje (ćelija). Tada treba da mi se ažurira poslednje polje.

Probao sam ovako:

Code:

procedure TMainForm.DBGrid1KeyPress(Sender: TObject; var Key: Char);
var
  updated: Extended;
begin
  if (Key = #13) or (Key = #38) or (Key = #40) then
    begin
      // neka kalkulacija čiji je rezultat updated
      cds.Edit;
      cds.Fields[4].AsFloat := updated;
      cds.Post;
    end;
end;


(#38 i #40 su kodovi za strelice gore i dole)

Međutim, ovaj event ne hvata strelice (Ne hvata ni klik mišem, ali se to valjda može srediti.)
[ iculibrk @ 05.07.2025. 17:06 ] @
Umesto OnKeyPress koristi OnColExit