StringGrid - możliwość edycji tylko DRUGIEJ kolumny

0

Delphi 5.0.
Mam komponent StringGrid (wartość goEditing=false) który ma 4x kolumny i 15 wierszy. W jaki sposób zrobić aby do edycji była możliwa tylko i wyłącznie kolumna druga? Ja znam tylko opcję tylko do całego komponentu, natomiast nie potrafię się odwołać do konkretnej, komórki bądź też kolumny.

Za pomoc dziękuje :)

0
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    procedure StringGrid1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure StringGrid1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.StringGrid1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  col,row : integer;
begin
StringGrid1.MouseToCell(x,y,col,row);
if col=1 then
   begin
   StringGrid1.Options:=StringGrid1.Options+[goEditing];
   StringGrid1.EditorMode:=true;
   end
end;

procedure TForm1.StringGrid1Click(Sender: TObject);
begin
StringGrid1.Options:=StringGrid1.Options-[goEditing];
end;

end.
0

Wielkie dzięki. Oczywiście działa.
Nawet sam spróbuję napisać funkcję która by reagowała nie tylko na myszke, lecz także na klawisz ENTER.
Jeszcze raz dzięki :)

0

Dzięki za rade ale mam kolejną prośbę, bo ja sobie nie radze a siedze już troche nad tym.
Mianowicie chce zrobić to samo zdarzenie tylko na klawisza enter.
Zdarzenie działa poprawnie ale np.jak chcę zedytować np. konkretną komórke to musze wcisnąć:
1- klawisz ENTER - goEditing ustawia sie na true;
2- wypełniam komórke
3- klawisz ENTER - aby opóscić edytowaną komórke i przejść do następnej
i tak w koło. I rodzi się moje pytanie. Czy można jakoś obejść to pierwsze ENTER?, zachowując opcję goAlwaysShowEditor:=false?

0
Cawon napisał(a)

Czy można jakoś obejść to pierwsze ENTER?, zachowując opcję goAlwaysShowEditor:=false?

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    procedure StringGrid1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
   Msg: TMsg;
begin
if StringGrid1.Col<>1 then
   begin
   StringGrid1.Options:=StringGrid1.Options-[goEditing];
   exit;
   end;
if (not (goEditing in StringGrid1.Options))and(Key=13) then
   begin
   StringGrid1.Options:=StringGrid1.Options+[goEditing];
   StringGrid1.EditorMode:=true;
   while PeekMessage(Msg, 0, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE or PM_NOYIELD) do;
   end
else
   if StringGrid1.RowCount>=(StringGrid1.Row+2) then
      StringGrid1.Row:=StringGrid1.Row+1
end;

end.
0

Co oznacza ta linijka, ten zapis? Czy ona jest istotna? Bo ja nie bardzo rozumiem :/

while PeekMessage(Msg, 0, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE or PM_NOYIELD) do;
0
Cawon napisał(a)

Co oznacza ta linijka, ten zapis? Czy ona jest istotna? Bo ja nie bardzo rozumiem :/

while PeekMessage(Msg, 0, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE or PM_NOYIELD) do;

qrcze, jak ją napisałem to widocznie jest istotna :| .
zawsze możesz ją wywalić żeby sprawdzić, a zamiast się pytać co robi dokładnie,swój cytat wpisz w googlach i będziesz wiedział ! ludzie na pulpicie napiszcie dużymi litermi <font size="6">GOOGLE</span>, i trzymajcie tam ten napis tak długo aż się nauczycie najpierw swoje pytania tam kierować !

pozdrawiam...

0

OK. sorrki. najpierw napisałem posta a później poszukałem w googlach. Moja wina, moja wina.... :(
A poza tym wszystko pięknie działa, ale jest jeden problem.
Mianowicie do komórki można wpisać tylko jeden znak, a ja potrzebuje kilka znaków.
Więcej znaków można wpisać tylko w ostatnim wierszu.

0

polecam DEBUGGER !!!

procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
   Msg: TMsg;
begin
if StringGrid1.Col<>1 then
   begin
   StringGrid1.Options:=StringGrid1.Options-[goEditing];
   exit;
   end;
if (not (goEditing in StringGrid1.Options)) then
   begin
   StringGrid1.Options:=StringGrid1.Options+[goEditing];
   StringGrid1.EditorMode:=true;
   while PeekMessage(Msg, 0, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE or PM_NOYIELD) do;
   end
else
   if (StringGrid1.RowCount>=(StringGrid1.Row+2)) and (Key=13) then
      StringGrid1.Row:=StringGrid1.Row+1
end;
0

Teraz wszystko śmiga jak trzeba.

Wielkie dzięki za pomoc i wyrozumiałość.
Kolejne pytanie może być bardzo zabawne dla Ciebie, ale spróbuje.
Obecnie na rynku jest sporo książek, o tematyce programowania w Delphi. Poleciłbyś jakąś książke, przystępnie napisaną i po której można wiele sie nauczyć? Ja osobiście nie jestem geniuszem w tej dziedzinie, ale podstawy znam :) i chciałbym pogłębic swoja wiedze w tym kierunku. Jednym słowem programowanie mnie fascynuje, a dlaczego w Delphi? Bo miałem to na studiach :] . kiedyś może powalcze w innych językach.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0