Witam.
Dwa słowa wstępu. W moim komponencie pochodnym od TStringGrid ma mechanizm który po zakończeniu edycji robi automatycznie zapis danej komórki do bazy. Informuję tylko komponent do jakiej ma się odwoływać tabeli, a reszta dzieje się już automatycznie.
Oczywiście muszę jeszcze dodatkowo w komponencie dać zgodę na automatyczny zapis. Komponent ma polecenia do odczytu danych z bazy i w trakcie tej czynności zapamiętuje oryginalne nazwy kolumn z bazy. Na tej podstawie wie gdzie dane z edytowanej kolumny mają trafić, oczywiście w kolumnie zero siatki trzymam ID z bazy.
Teraz naszła mnie ochota uruchomić goColMoving. I zaczyna się problem ułożenie kolumn na ekranie nie będzie pasowało do zapamiętanej kolejności w komponencie. Tak urodził się pomysł stworzenia własnej Class-y. I włożenie do niej pomocniczych procedur oraz funkcji potrzebnych do przestawiania nazw kolumn z bazy. Plus jeszcze coś więcej. Tak przy okazji.
Czy można to zrobić bardzie elegancko.
W załączniku jest forma testowa.
unit ucGrid;
interface
type
TTabGrid = record
lp : integer; // liczba poprządkowa ustawienie default
pos : integer; // pozycja kolumny w siatce
nameSQL : string; // nazwa kolumny w bazie
nameSG : string; // nzawa kolumny wyśietlanej na ekranie dla Fixed
alignFixed : integer; // wyświetlanie dla Fixed
alignCells : integer; // wyświetlanie dla Cells
end;
type
TmyTabGrid = class
private
FCount : integer;
TabGrid : array of TTabGrid;
procedure SetCount(const Value: integer);
protected
public
procedure Add( myTabGrid : TTabGrid );
procedure SetPos(Index: integer; myTabGrid : TTabGrid);
function GetPos(Index: integer) : TTabGrid;
procedure ColumnMoved( FromIndex, ToIndex: Integer);
published
constructor Create( Size : integer );
destructor Destroy; override;
property Count : integer read FCount write SetCount;
end;
implementation
constructor TmyTabGrid.Create( Size : integer );
begin
SetLength(TabGrid, size );
FCount := size;
end;
destructor TmyTabGrid.Destroy;
begin
inherited Destroy;
end;
procedure TmyTabGrid.Add( myTabGrid : TTabGrid );
begin
FCount := FCount + 1;
SetLength(TabGrid, FCount );
TabGrid[FCount-1] := myTabGrid;
end;
procedure TmyTabGrid.SetPos(Index: integer; myTabGrid : TTabGrid);
begin
TabGrid[Index] := myTabGrid;
end;
procedure TmyTabGrid.ColumnMoved( FromIndex, ToIndex: Integer);
var pamTabGrid : TTabGrid;
n : integer;
begin
if ToIndex>FromIndex then
begin
pamTabGrid := TabGrid[FromIndex]; // która kolumna
for n := FromIndex to ToIndex-1 do TabGrid[n]:= TabGrid[n+1];
TabGrid[ToIndex] := pamTabGrid;
end
else
begin
pamTabGrid := TabGrid[FromIndex]; // która kolumna
for n := FromIndex downto ToIndex+1 do TabGrid[n]:= TabGrid[n-1];
TabGrid[ToIndex] := pamTabGrid;
end;
end;
function TmyTabGrid.GetPos(Index: integer) : TTabGrid;
begin
GetPos := TabGrid[Index];
end;
procedure TmyTabGrid.SetCount(const Value: integer);
begin
if FCount <> Value then
begin
FCount := Value;
SetLength(TabGrid, Value );
end;
end;
end.