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 <B><font size="6">GOOGLE</span></B>, 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.

0

z książek praktycznie nie korzystam (korzystałem tylko jak się uczyłem Pascala), minimalnie z 'Delphi 6 Vademecum profesjonalisty', 98% to google, grupy, msdn.
[EDIT]
może niech się inni wypowiedzą, ale uważam że szkoda kasy.

0

Osobiscie popieram przedmowce. Tak naprawde jedyna ksiazka ktora pomogla mi w nauczeniu sie programowania to bylo cos o assamblerze w czasach C=64. od tej pory helpy, Google i tego typu sprawy.

0

To teraz pozostaje mi tylko czytać i czytać :D.
Jeszcze jenda rzecz. Jak ustawić aby wiersze w StringGrid były różnego koloru tj. wiersze parzyste były koloru zielonego, a wiersze nieparzyste zostały bez zmian - stadardowe ustawienia. ;P

0

eh, postudiuj poniższy przykład:

procedure TEventHandlers.NewTntStringGridDrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
var sW : widestring;
     s : string;
begin
with TtntStringgrid(Sender).Canvas do
     begin
     Lock;
     if (gdSelected in State) then
        begin
        Brush.Color:=clHighlight;
        Font.Color:=clHighlightText;
        end
     else
        begin
        if (ARow=0)or(ACol=0) then
           Brush.Color:=clBtnFace
        else
           Brush.Color:=clWindow;
        Font.Color:=clWindowText;
        end;
     if (ARow>0)and(ACol>0) then
        begin
        Font.Name:='Lucida Console';
        Font.Size:=8;
        Font.Style:=[];
        end
     else
        begin
        Font.Name:='Tahoma';
        Font.Size:=7;
        Font.Style:=[fsBold];
        end;
     s:=UTF8Encode(TtntStringgrid(Sender).Cells[ACol,ARow]);
     sW:=TtntStringgrid(Sender).Cells[ACol,ARow];
     FillRect(Rect);
     if (TextWidth(s)+2)>TtntStringgrid(Sender).ColWidths[ACol] then
        begin
        while ((TextWidth(s+'...')+2)>TtntStringgrid(Sender).ColWidths[ACol])and(s<>'') do
              SetLength(s,Length(s)-1);
        SetLength(sW,length(s));
        if s='' then
           begin
           Brush.Color:=clRed;
           FillRect(Rect);
           end
        else
           begin
           Font.Color:=clRed;
           WideCanvasTextOut(TtntStringgrid(Sender).Canvas,Rect.Right-2-TextWidth('...'), Rect.Top, '...');
           if (gdSelected in State) then
              Font.Color:=clHighlightText
           else
              Font.Color:=clWindowText;
           end;
        end;
     if sW<>'' then
        WideCanvasTextOut(TtntStringgrid(Sender).Canvas,Rect.Left+2, Rect.Top, sW);
     Unlock;
     end;
end;
0

Lubie takie odpowiedzi. Zobaczymy czy sobie poradze. Przynajmniej się sprawdze :)
Ale jak mi szare komórki odmówią posłuszeństwa to poproszę o pomoc [green]

0

Po wileku trudach udało się:

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);

begin

begin
  with (Sender as TStringGrid) do
  begin

    if (ACol=0) or (ARow=0) then
      Canvas.Brush.Color:=clBtnFace
    else
    begin
      if ARow mod 2=0 then
        Canvas.Brush.Color:=clAqua
      else
        Canvas.Brush.Color:=clLime;
      Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + 2, cells[acol, arow]);
      Canvas.FrameRect(Rect);
    end;
  end;
    end;
    end;

Ale pytanko. W momencie edycji jakiejś komórki tło wraca do standarodowego koloru, a jeżeli opuszczamy komórkę to wraca kolor taki jaki ustawiłem.
Czy można jakoś ustawić tło komórki aby było cały czas takie jakie ja chce, bez względu na to co się robi? jednym słowem żeby nigdy się nie zmieniało?

0

nie mam pojęcia :) imo tak jest lepiej.

0

A jak zrobic zeby zablokowac tylko jedna komorke w Stringgridzie?????? :| Stringgrid1.Cells[1,1] np. :| ..... ???????

0

a nie caly wiersz albo cala kolumne jak wyzej opisaliscie .....

0

Zakładam że wartość goEditing ustawiona jest domyślnie na true

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, 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)and(row=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

A może ktoś mi powie jak zrobić... Mam stringGirda w którym moge manualnie dodawać wiersze (po przez kliknięcie Buttona). Po uruchomieniu aplikacji mam dwa wiersze. dodaje kolejny wiersz, i kolejny wiersz itp. Dodaje np: 20-sty wiersz i go nie widze, gdyż jest on za nisko w StringGirdzie (pojawia się suwak).
I jak zrobić aby po dodaniu tego wiersza, był on widoczny - czyli według mnie wiersze powyżej powinny się przesunąć do góry, tak aby można było widzieć dodany wiersz i go ewentualnie edytować.
Jeżeli napisałem to w taki sposób, że tylko ja rozumiem o co mi chodzi, to dajcie znać to napisze inaczej ;P

0

TopRow [!!!]

0

No jasne... [green]

Dzięki

0

Pokolorowałem sobie na przemian wiersze (oczywiście w zdarzeniu StringGrid1DrawCell). Natomiast przy opcji goRowSelect:=true, zaznaczony wiersz nie podświetla się ? standardowo na kolor niebieski. Natomiast gdybym nie ?pokolorował? wierszy to zaznaczenie byłoby widoczne. Jak zrobić aby zaznaczenie było widoczne przy ?pokolorowanych wierszach?? :>

0
if (gdFocused in State) or (gdSelected in State) then
  //trzeba narysować komórkę z tłem zaznaczenia i kolorem textu też
0

Dzięki za wskazówkę! Oczywiście dużo pomogła :)

0

Jak zrobić aby zedytować (używając klawiatury, a nie myszki) wcześniej wprowadzoną wartość w komórce, tak aby po wprowadzeniu nowej wartości, stara zniknęła, a nie dopisywała się do starej.
Poniższy kod nie usuwa starej wartości. Co w nim trzeba zmienić?

procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);

begin
 if status=true then
  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;
           end;
  END;
end;
0

Ktoś pomoże??? :/

0

hmm nie wiem czy dobrze rozumie o co Ci Chodzi ale chyba porostu nie wchodź w tryb edycji czyli

//StringGrid1.EditorMode:=true;

powinno pomóc.

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