Własna Class-a

0

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.
3
dasej napisał(a):

Witam.

Taaa... a ja mam pytania, ponieważ wydaje mi się, że cały ten pomysł można spokojnie do kosza wyrzucić.

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.

STOP.
Dlaczego StringGrid i bazy danych (to z definicji chore połączenie)?
Dlaczego nie TDBGrid i jakikolwiek TDataSet - np. ZEOS?

Gdybyś zrobił to "normalnie", to wszystkie opisane przez Ciebie problemy nie istniałyby.

Czy można to zrobić bardzie elegancko.

Tak, można.
Najprościej - wywalić tego TStringGrida ;-)

W załączniku jest forma testowa.

W załączniku to proponuję dodać cały projekt testowy, a nie kawałek kodu...
Zawsze to szybciej, jeśli ktokolwiek ma to sprawdzić, a może to po prostu skompilować.

PS.
Litości, ale "Class-y"?
KLASY, to jest KLASA a jej instancja to OBIEKT.
A nie objekt classy...

1

@dasej masz złą architekturę programu. Kontrolka TStringGrid nie służy do trzymania danych, a jedynie ich wyświetlania na ekranie.

Po drugie kolejność kolumn na ekranie nie ma nic do kolejności kolumn w bazie. Użyj po prostu komponentów bazodanowych jak kolega wyżej radzi i większość problemów o jakich pisze zniknie samoczynnie.

0

Dziękuję za odpowiedzi..
Są bardzo fachowe i szczegółowo opisuje działanie poprawne i nie poprawne moje class.

Pozdrawiam.
Janusz

0
dasej napisał(a):

Dziękuję za odpowiedzi..
Są bardzo fachowe i szczegółowo opisuje działanie poprawne i nie poprawne moje class.

No dobrze, ale nie odpowiedziałeś na pytania.
A więc - dlaczego StringGrid a nie DBGrid?

0

To Ja postawię inne pytanie.
Skoro nie chcesz odpowiedzieć to jaką ........................... piszesz?
Dla poprawienia sobie humor czy zwiększenia swojego ego, a może dla nabicia sobie punków, tak często o tym piszesz na tym forum.

0
dasej napisał(a):

To Ja postawię inne pytanie.
Skoro nie chcesz odpowiedzieć to jaką ........................... piszesz?
Dla poprawienia sobie humor czy zwiększenia swojego ego, a może dla nabicia sobie punków, tak często o tym piszesz na tym forum.

Przecież odpowiedział co zrobiłeś źle i jak to zrobić bardziej elegancko, a że ty tego nie rozumiesz to inna sprawa. Proponuję najpierw się poduczyć a dopiero potem wyskakiwać z ryjem do ludzi posiadających większą wiedzę od ciebie.

0

@babubabu: Bartosz, to nie ładnie, się tak odnosić do ludzi których nie znasz.

0
dasej napisał(a):

To Ja postawię inne pytanie.

Mam Ci nie mówiła, że to nieładnie odpowiadać pytaniem na pytanie?

Skoro nie chcesz odpowiedzieć to jaką ........................... piszesz?
Dla poprawienia sobie humor czy zwiększenia swojego ego, a może dla nabicia sobie punków, tak często o tym piszesz na tym forum.

Chciałem Ci pomóc, ale masz w d pomoc, ponieważ uważasz, że Twój pomysł jest naj.
A sądząc po wcześniejszych wpisach, to sporo się napracowałeś przy tym, tylko po prostu dałeś ciała z architekturą (ponieważ z definicji jest błędna).
A teraz będzie coraz więcej problemów.

Ale używanie StringGrida do edycji i wyświetlania danych bezpośrednio z bazy danych jest z czapy.
Skoro piszesz w Tokyo i koniecznie chcesz korzystać z StringGrida, to raczej powinieneś iść w stronę LiveBindingu.
Ale rozumiem - to Cię przerasta i pewnie niewiele rozumiesz z tego co napisałem.
Trudno.

Ale jeśli już naprawdę musisz robić to na StringGrid, to podeślij cały projekt z uwzględnieniem tylko i wyłącznie problemu, który Cię nurtuje.
A jeśli Ci się nie chce, to proszę - nie zawracaj głowy...

PS.
Mój humor i ego ma się dobrze i nie potrzebne mu tak mikre pożywki.
Punkty forum - a co to i po co mi to?

PS2.
Zmień sobie tag, bo Twoja znajomość Delphi (jak dla mnie) jest w cholerę daleko od "dobra"...

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