Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Delphi] Dane w TStringGrid

Techmann 16 Gru 2003 07:35 13776 11
  • #1 16 Gru 2003 07:35
    Techmann
    Poziom 12  

    Mam taki problem:
    W obiekcie StringGrid przedstawiam pewne dane.Ale potrzebna mi osobna procedura do wypełnienia tego komponentu samymi zerami.No i tu zaczeły się schody.Po zadeklarowaniu takiej procedury w klasyczny sposób program przy próbie kompilacji zgłasza błąd - niezadeklarowana zmienna wskazując na obiekt StringGrid.Jeśli ten obiekt zadeklaruję jako
    zmienną globalną to program się kompiluje,ale powoduje błąd w czasie uruchamiania.
    Gdzie jest ten kruczek?

    pozdrawiam


    Problem rozwiązany. Zamykam. - arnoldziq

    0 11
  • #2 16 Gru 2003 08:55
    PiotrekD
    Poziom 12  

    przykladowo ....

    unit costam;
    interface
    uses
    .........
    type
    TForm1 = class(TForm)
    EView: TStringGrid;
    ...........
    end;

    var
    ............
    ///I teraz Procedura .......

    procedure TForm1.FormCreate(Sender: TObject);
    var i,k:integer;
    begin
    //w zaleznosci ile masz kolumn i wierszy
    for i:=1 to 16 do
    for k:=1 to 16 do
    begin
    EView.Cells [k,i]:= '0';
    end;
    end;
    end;

    0
  • #3 16 Gru 2003 09:59
    Techmann
    Poziom 12  

    Dzieki za odzew,sprawadzę to ,gdy wrócę z pracy.

    Możesz do końca wyjaśnić ten sposób deklaracji.Czy jest o coś tym w help'ie?

    pozdrawiam :wink:

    0
  • #4 16 Gru 2003 13:35
    elektryk
    Poziom 42  

    Pewnie problem polega na tym że objekt typu TStringGrid należy do innego objektu i wszystkie odwołania muszą być albo z metod obiektu nadrzędnego albo przez "sztuczke" objekt_nadrzędny.objekt_podrzędny.metoda przy czym to drugie rozwiązanie jest nieco sprzeczne z ideą hermetyczności objektów.

    0
  • #5 16 Gru 2003 14:17
    Techmann
    Poziom 12  

    Ok. muszę przyjrzeć sie temu trochę bliżej.

    pozdrawiam :)

    0
  • #6 16 Gru 2003 20:33
    Techmann
    Poziom 12  

    Już przeanalizowałem wyżej przedstawiony przykład.To nie to o co mi chodzi.
    Może jeszcze raz to przedstawię:

    Mam procedure ,która wypełnia danymi obiekt StringGrid1 (tak mam zadeklarowany =EView).
    To działa ale jeżeli zadeklaruję kolejną procedurę związaną z tym obiektem to pojawiają
    się wyżej opisane problemy.Przykład:
    .....
    procedure TForm1.Button2Click(Sender: TObject);

    var
    Rez1,Rez2,i,j:integer;
    begin
    for i:=1 to 16 do
    for j:=1 to 16 do
    begin
    if i<>j then
    begin
    Rez1:=StrToIntDef(Stringgrid1.Cells[i,j],0);
    Rez2:=StrToIntDef(Stringgrid2.Cells[i,j],0);
    if Rez1<>Rez2 then
    if Rez1<Rez2 then
    Memo1.Lines.Add('Zwarcie między'+IntToStr(i-1)+' i '+IntToStr(j-1))
    else
    if Rez1>Rez2 then
    Memo1.Lines.Add('Przerwa między'+IntToStr(i-1)+' i '+IntToStr(j-1))
    end
    else
    end;
    begin
    ShowMessage('Test OK!');
    end;
    end;
    .........

    a wywołanie tej procedury powoduje błąd jw. pisałem

    procedure okno;
    var
    i,j:integer;

    begin
    for i:=1 to 16 do
    for j:=1 to 16 do
    StringGrid1.Cells[i,j]:='0';
    end;

    Program nie jest jeszcze zoptymalizowany(to chyba widać :)
    Co tu nie gra?

    Ok Ok już mam

    nalezy jedynie jawnie wskazać że komponent nalezy do formularza

    ...
    Form1.StringGrid1.Cells[i,j]='0'; :D
    ...
    lub uczynienie procedury jawnym obiektem klasy formularza TForm1

    Dzieki za naprowadzenie na trop :)

    0
  • #7 17 Gru 2003 00:33
    elektryk
    Poziom 42  

    Techmann napisał:
    procedure TForm1.Button2Click(Sender: TObject);
    var
    Rez1,Rez2,i,j:integer;
    begin
    for i:=1 to 16 do
    for j:=1 to 16 do
    begin
    if i<>j then
    begin
    Rez1:=StrToIntDef(Stringgrid1.Cells[i,j],0);
    Rez2:=StrToIntDef(Stringgrid2.Cells[i,j],0);
    if Rez1<>Rez2 then
    if Rez1<Rez2 then
    Memo1.Lines.Add('Zwarcie między'+IntToStr(i-1)+' i '+IntToStr(j-1))
    else
    if Rez1>Rez2 then
    Memo1.Lines.Add('Przerwa między'+IntToStr(i-1)+' i '+IntToStr(j-1))
    end
    else
    end;
    begin
    ShowMessage('Test OK!');
    end;
    end;
    Co jest nie tak z tą procedurą? Właśnie u siebie sprawdziłem że metoda "podczepiona" pod przycisk:
    Code:
    procedure TForm1.BitBtn1Click(Sender: TObject);
    
    var i:integer;
    begin
      i:=StrToIntDef(Stringgrid1.Cells[1,1],0);
      label1.Caption:=inttohex(i,4);
    end;
    działa bezproblemu i nie powoduje żadnych błędów przy kompilacji

    0
  • #8 17 Gru 2003 07:27
    Techmann
    Poziom 12  

    Hej!

    Sam do końca nie wiem co nie jest tak.Dopiero taka procedura u mnie działała:
    procedure okno;
    var
    i,j:integer;

    begin
    for i:=1 to 16 do
    for j:=1 to 16 do
    Form1.StringGrid1.Cells[i,j]:='0';
    end;

    i musiałem jeszcze zadeklarować na samym początku modułu StringGrid1:TStringGrid;

    Dopiero takie ustawienia powodują ,że mogę się odwoływać do tego komponentu z tej procedury.Jeżeli to Tobie działa bez takich zabiegów to sam nie wiem.O tym deklarowaniu wyczytałem w "ABC Delphi6" A.Daniluka" i pomogło.Wydawało mi się ,że w programie z jedną formatką
    wszystkie komponenty są dostepne bezpośrednio dla każdej procedury.

    :?: W każdym razie działa.

    Swoją drogą ,czy pierwsza zadeklarowana procedura odwołująca się do
    takiego komponentu ma jakis priorytet?A każda nastepna musi być tak deklarowana?Nie wydaje mi się.Hm...

    0
  • #9 17 Gru 2003 08:17
    elektryk
    Poziom 42  

    Techmann napisał:
    i musiałem jeszcze zadeklarować na samym początku modułu StringGrid1:TStringGrid;
    A gdzie była wcześniej zadeklarowana? Wyślij kod programu.

    0
  • #10 17 Gru 2003 21:08
    Techmann
    Poziom 12  

    Sorry że tak późno,a wygląda to tak

    unit Terminal;

    interface

    uses
    Windows, Messages, SysUtils, Classes, Graphics,
    Controls, Forms, Dialogs, StdCtrls, ComCtrls, ToolWin, ExtCtrls, Grids;
    var
    StringGrid1:TStringGrid; <----- TO TA DEKLARACJA !?
    type
    TForm1 = class(TForm)
    CloseComm: TButton;
    OpenComm: TButton;
    Send: TButton;
    Receive: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Button1: TButton;
    RichEdit1: TRichEdit;
    RichEdit2: TRichEdit;
    RichEdit3: TRichEdit;
    OpenDialog1: TOpenDialog;
    StringGrid2: TStringGrid;
    StringGrid1: TStringGrid;
    Button2: TButton;
    Edit1: TEdit;
    Memo1: TMemo;
    SaveDialog1: TSaveDialog;
    procedure CloseCommClick(Sender: TObject);
    procedure OpenCommClick(Sender: TObject);
    procedure SendClick(Sender: TObject);
    procedure ReceiveClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure SaveFileAsClick(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);

    private
    { Private declarations }
    function Write_Comm(hCommDev: THANDLE;
    nNumberOfBytesToWrite: DWORD): Integer;
    function Read_Comm(hCommDev: THANDLE; Buf_Size: DWORD): Integer;
    public
    { Public declarations }
    end;

    var
    Form1: TForm1;
    procedure ZerowanieTabel;
    implementation

    uses RS_14moje2_Unit2kopia;

    {$R *.DFM}

    const
    .
    .
    .
    cała reszta już standartowo. Ja tego nie kumam.O co chodzi!!?

    0
  • #11 17 Gru 2003 23:23
    elektryk
    Poziom 42  

    Techmann napisał:
    uses
    Windows, Messages, SysUtils, Classes, Graphics,
    Controls, Forms, Dialogs, StdCtrls, ComCtrls, ToolWin, ExtCtrls, Grids;
    var
    StringGrid1:TStringGrid; <----- TO TA DEKLARACJA !?
    type
    TForm1 = class(TForm)
    CloseComm: TButton;
    OpenComm: TButton;
    Send: TButton;[...]
    No cóż ta deklaracje to już znaczenie wypacza programowanie objektowe, tak się zastanawiam czy ona się wogóle kompiluje. Zostaw deklaracje w objekcie i wszelkie modyfikacje objektu rób w METODACH objektu nadrzędnego a nie w oddzielnych procedurach.

    0
  • #12 18 Gru 2003 07:14
    Techmann
    Poziom 12  

    :)

    Nie jestem programistą ,ale i dla mnie to jest bardzo dziwny zapis.
    To wynik eksperymentów bo sam nie wiedziałem o co chodzi.
    Czy się kompiluje?Tak. :D Działa!
    To mój pierwszy przypadek ,że mam problem z wywołaniem jakiejś procedury.

    pozdrawiam


    Już to dziwactwo wywaliłem.Uporządkowałem program i działa bez tej dziwnej deklaracji. :)


    hej

    0
  Szukaj w 5mln produktów