Problem z globalną tablicą.

0

Witam serdecznie wszystkich,
Mam problem z prosta aplikacją pisaną na Delphi (Rad studio 10.4)
Problem dotyczy deklaracji zmiennej globalnej w tym przypadku jest to tablica " Klienci:".

var
  Form1: TForm1;
  Klienci: array [0 .. 400, 0 .. 10] of String;
  PlanDnia: array [0 .. 200, 0 .. 10] of String;
  KasaDnia: array [0 .. 100, 0 .. 10] of String;
.
.
.
procedure TForm1.dodaj_klientaClick(Sender: TObject);

var
  i: integer;

begin
  for i := 0 to 400 do
  begin
    if Klienci[i,0] = '' then
    begin
      Klienci[i, 0] := inttostr(i+1);
      Klienci[i, 1] := nazwa_klienta.Text;
      Klienci[i, 3] := Informacje_dodatkowe.Text;
      exit
    end;
  end;
end;

Jest to aplikacja w wersji multidevice(win+android), jak testowałem wersje na sam tylko Windows, to wszystko działało bez problemu. A przy wersji multidevice wywala błąd przy wywołaniu tablicy klienci:

[dcc32 Error] main.pas(74): E2149 Class does not have a default property

Ma ktoś może pomysł jak w aplikacji multiplatformowej zadeklarować skutecznie tablice globalną taką która będzie dostępna w każdej funkcji i procedurze programu.

1

Po pierwsze pora się dowiedzieć o record'ach
https://static.4programmers.net/Delphi/Rekordy

3

@bst1979: a nie możesz tego programu napisać tak jakoś… nowocześniej? Globalne zmienne z danymi dla logiki (tym bardziej w module formularza) to paskudztwo. To samo tablice, w dodatku o statycznym rozmiarze. Przespałeś ostatnie 20 lat, czy piszesz ten program w oparciu o tutorial z ubiegłego tysiąclecia, stworzony przez leśnego dziada? ;)

Co sugeruję — po pierwsze, wydziel tego typu deklaracje do osobnego modułu, tak aby były niezależne od formularzy. Po drugie, dane przechowuj w małych klasach — nie w wielu prostych tablicach. Od biedy mogą być rekordy, ale klasy będą lepsze — w końcu i tak cały program okienkowy jest zorientowany obiektowo. Po trzecie, do przechowywania zbioru danych skorzystaj z listy generycznej, która jest prosta w obsłudze i daje mnóstwo możliwości.

I po czwarte — przeczytaj jakiś tutorial na temat programowania w tym środowisku.

0

Dokładnie 20 lat przerwy w programowaniu miałem, zgadliście w 100%. To ma być prosty program, który ułatwi mi trochę życie. Da się w ogóle napisać to na tablicy globalnej tak jak to planowałem.

0

Nie widzę w tym kodzie błędu — składniowo jest poprawnie. Jednak nie wiem której linijki błąd dotyczy, bo wkleiłeś ich 25, a błąd dotyczy linii 74. A czy w ogóle main.pas to moduł formularza?

0

Tu w na forum w kodzie będzie to linia 19 pierwszy raz jak pojawia się w kodzie odwołanie do tablicy globalnej.

0

Pokaż deklarację klasy TForm1. Mam pewien pomysł, ale najpierw chcę się upewnić, czy dobrze kombinuję.

0
unit main;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes,
  System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.TabControl,
  FMX.Memo.Types, FMX.StdCtrls, FMX.ScrollBox, FMX.Memo,
  FMX.Controls.Presentation, FMX.Edit, FMX.ListBox, System.Rtti, FMX.Grid.Style,
  FMX.Grid;

type
  TForm1 = class(TForm)
    TabControl1: TTabControl;
    Dodaj: TTabItem;
    PlanDnia: TTabItem;
    nazwa_klienta: TEdit;
    Informacje_dodatkowe: TMemo;
    dodaj_klienta: TButton;
    wybierzklienta: TComboBox;
    kwota: TEdit;
    uwagi: TMemo;
    zapisz: TButton;
    TabItem1: TTabItem;
    wyierzklientakasa: TComboBox;
    StringGrid1: TStringGrid;
    Klienci: TTabItem;
    zestawienieklientow: TStringGrid;
    pobralem: TEdit;
    KasaZapisz: TButton;
    MemoKasa: TMemo;
    sg: TStringGrid;
    Column1: TColumn;
    Column2: TColumn;
    Column3: TColumn;
    Column4: TColumn;
    Column5: TColumn;
    Column6: TColumn;
    Column7: TColumn;
    Column8: TColumn;
    Column9: TColumn;
    Column10: TColumn;
    Column11: TColumn;
    procedure FormActivate(Sender: TObject);
    procedure dodaj_klientaClick(Sender: TObject);

  private
    { Private declarations }
  public

    { Public declarations }
  end;

var
  Form1: TForm1;
  Klienci: array [0 .. 400, 0 .. 10] of String;
  PlanDnia: array [0 .. 200, 0 .. 10] of String;
  KasaDnia: array [0 .. 100, 0 .. 10] of String;

implementation

{$R *.fmx}
{$R *.LgXhdpiTb.fmx ANDROID}

procedure TForm1.dodaj_klientaClick(Sender: TObject);

var
  i: integer;

begin
  for i := 0 to 400 do
  begin
    if Klienci[i,0] = '' then
    begin
      Klienci[i, 0] := inttostr(i+1);
      Klienci[i, 1] := nazwa_klienta.Text;
      Klienci[i, 3] := Informacje_dodatkowe.Text;
      exit
    end;
  end;
end;

4

Tak jak podejrzewałem :D

Popatrz na linię 28 - Klienci: TTabItem;. Masz powtórzoną nazwę zmiennej.

I jak w ramach metody będącej częścią klasy TForm1 odwołujesz się do czegoś o nazwie klienci to kompilator przyjmuje, że chodzi Ci o Form1.Klienci a nie o globalna tablicę o takiej samej nazwie. Zmień nazwę jednego z "klientów" i powinno być OK.

1

Dziękuje z całego serca, to było to :)

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