Const array of array w Delphi 2007

0

Mam taki kod:

type
  TColumnField = record
    FieldName: string;
    ColName: string;
    Width: integer;
  end;

  TArrayOfCf = array of TColumnField;
  PArrayOfCf = ^TArrayOfCf;

const
  CF_PRZYJECIE: array[0..1] of TColumnField = (
    (FieldName: 'ID'; ColName: 'ID'; Width: 20),
    (FieldName: 'Name'; ColName: 'Nazwa'; Width: 50)

  );


  CF_KSIEGOWOSC: array[0..2] of TColumnField = (
    (FieldName: 'ID'; ColName: 'ID'; Width: 0),
    (FieldName: 'Group'; ColName: 'Grupa'; Width: 15),
    (FieldName: 'Name'; ColName: 'Nazwa'; Width: 120)

  );

Chciałbym stworzyć tablicę tych tablic. Robię tak:

CF_2: array[0..1] of PArrayOfCf = (
    @CF_PRZYJECIE,
    @CF_KSIEGOWOSC
  );

Mam także funkcje, która zwraca mi odpowiedni CF_ w zależności od parametru:

  function GetColFields(k: integer): TArrayOfCf;
  var
    i : integer;
  begin
    case k of
      101 : result := TArrayOfCf (CF_2[0]);
      102 : result := PArrayOfCf(CF_2[1])^;
    end;
  end;
.
.
.
var
  CF : TArrayOfCf;

  CF := GetColFields(101);

Wywołanie funkcji GetColFields wywala błąd. Nie wiem jak to obejść.

Mogę oczywiście funkcje tą zrobić tak: (To działa):

    case k of
      101 : begin
            SetLength(b, Length(CF_PRZYJECIE));
    for I := 0 to Length(CF_PRZYJECIE) - 1 do
      b[I] := CF_PRZYJECIE[I];
      end;
      102 : begin
            SetLength(b, Length(CF_KSIEGOWOSC));
    for I := 0 to Length(CF_KSIEGOWOSC) - 1 do
      b[I] := CF_KSIEGOWOSC[I];
      end;
    end;
    result := b;

Proszę o pomoc.

4

array of cośtam i array[i..j] of cośtam nie są zgodne ze sobą tak, byś mógł jedno rzutować na drugie.

0

Radzę zawsze opisywać co chcesz osiągnąć a nie jak to chcesz zrobić.

0

Autor (czyli ja :) ) chce jednego grida wykorzystać do wyświetlenia różnych wyników (wartości).
Mam 9 ustawień tego grida.
Od razu zaznaczam, że nie może się to odbywać poprzez zmianę zapytania do bazy danych.

Grid z którego korzystam jest zwykłym gridem nie DBGridem. DBGridy do których mam dostęp nie umożliwiają zaznaczania kilku wierszy, które nie są obok siebie (Poprzez Ctrl i klik myszką).

Chyba, że znacie jakieś rozwiązanie, które to umożliwia? Może to być także kolumna z checkbox'ami. Ale te checkbox'y nie mogą być jako pole w bazie danych. (Mam nadzieję, że wyraziłem się jasno).

0

Czyli masz pewną ilość kolumn z których wg jakieś tam opcji chcesz niektóre kolumny zrobić niewidocznymi?
Czy może się zmieniać kolejność kolumn?
Nazwy tych kolumn?

0

Tak zgadza się. Dane do grida mogą pochodzić z różnych zapytań. Różni użytkownicy powinni widzieć inne kolejności kolumn lub inne kolumny.

0

Moment, jeżeli to różne zapytania to czemu nie użyjesz automatu, który wpiszę cię wszystkie kolumny co masz w tym zapytaniu?

0

Bo to nie zawsze różne zapytania. Mam procedurę SQL, która zwraca wszystkie kolumny. Ale w zależności od parametru wyniki są różne (w sensie zwracanych wierszy). Potrzebuję dla różnych ustawień wyświetlać tylko niektóre kolumny i w różnej kolejności.

Mógłbym to zrobić na DBGrid, ale wtedy nie mogę zaznaczyć kilku wierszy aby coś z nimi zrobić. (Np. chcę zmienić pole STAUS w wierszu 1, 7, 16, 20).

2
TolkWimasz napisał(a):

Bo to nie zawsze różne zapytania. Mam procedurę SQL, która zwraca wszystkie kolumny. Ale w zależności od parametru wyniki są różne (w sensie zwracanych wierszy). Potrzebuję dla różnych ustawień wyświetlać tylko niektóre kolumny i w różnej kolejności.

Nie dotykaj grida, zmień wartość Field.Visible i dane pole (kolumna) będzie widoczna lub nie.
Widoczność kolumn możesz zapisać jako prosty string z nazwami pól rozdzielnych np. średnikiem. To co będzie na tej liście jest widoczne, pozostałe kolumny będą niewidoczne.
Do tego jedna prosta pętla w DataSet.AfterOpen i po sprawie.

Mógłbym to zrobić na DBGrid, ale wtedy nie mogę zaznaczyć kilku wierszy aby coś z nimi zrobić. (Np. chcę zmienić pole STAUS w wierszu 1, 7, 16, 20).

Przepraszam, nie możesz czy nie wiesz jak to zrobić?
To widziałeś:
http://delphi.about.com/od/usedbvcl/l/aa032503a.htm

0
TolkWimasz napisał(a):

... wyniki są różne (w sensie zwracanych wierszy).
Wierszy czy kolumn ?

0

Zwracane wynik mogą być różne zarówno wiersze jak i kolumny.
Zresztą nie tylko dane pochodzą z bazy danych, ale mogą także pochodzić np. z przetworzonych danych z webservices.

0

Skoro to są różne dane to dlaczego w jednym resultsecie? To zdecydowanie jest zły pomysł...

0

Czyli coś co ma już nazwane kolumny określonego typu.
Wg mnie wyświetlaj wszystkie kolumny z zapytania automatem.
Zaś na różne wariacje zrób kilka zapytań/widoków więcej.

Znacznie prościej określić że użytkownik ma dostęp do określonych widoków i nic więcej,
niż określić że użytkownik ma w ramach pewnego zapytania dostęp do określonych pól owego zapytania.

0

Ale jak pisałem wcześniej dane mogą pochodzić nie tylko z bazy danych ale także z webservices. Jest to wyświetlane w zwykłym Grid NIE DBGRID.

0

Mam nadzieje że wiesz iż wszystko co jest do wszystkiego, tak naprawdę jest do d..y.
Rozdziel to robiąc poprzez odpowiednie DataSource.

0
_13th_Dragon napisał(a):

Mam nadzieje że wiesz iż wszystko co jest do wszystkiego, tak naprawdę jest do d..y.

Pełna zgoda.

Rozdziel to robiąc poprzez odpowiednie DataSource.

Po co osobne widoki i DataSource? Żeby się więcej naklikać i mieć większy problem z utrzymaniem tego?
Lepiej, imo, napisać te kilkadziesiąt linii kodu który będzie generował czy to SQLa czy co tam innego w zależności od potrzeb. Od strony danych.
Natomiast prezentacja jest dokładnie taka sama i nic nie trzeba wymieniać, nawet jeśli doda się nowe dane...

Co do widoków - napisał przecież, ze to procedura zwraca dane - tylko jaka procedura i gdzie...
Teraz pisze jeszcze o WS.

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