Keresés

Új hozzászólás Aktív témák

  • vz12

    tag

    válasz Yodafon #1727 üzenetére

    Örülök hogy sikerült megoldani, végülis rájöttél hogy hol a hiba. :)
    Nekem csak ez a rengeteg egyedi értékadó utasítás "bántja" a szememet, ciklusban szebb volna, de persze így is működik ... ;)

    Sudokut már én is csináltam Delphi-ben de én más úton jártam, semmi szükségem nem volt gridre.

  • vz12

    tag

    válasz Yodafon #1723 üzenetére

    Azt hiszem hogy egy kis hibát vétettem, ezt korrigálom:

    mezo[1].OnSelectCell:=Sajat_SelectCell; // paraméterek NÉLKÜL
    mezo[2].OnSelectCell:=Sajat_SelectCell; // paraméterek NÉLKÜL

    Helyesen tehát "OnSelectCell" kell ide ahogy Fire példáján is látszik, ezt tévesztettem el. Ha az értékadás jobb oldalaira azonos eljárás nevet írsz be akkor szerintem megvalósul amit szeretnél, tehát közös OnSelectCell eljárása lesz minden példánynak.

    Egyébként ez is belerakható ám a ciklusba, így lesz biztosítva a legegyszerűbben a közös OnSelectCell, tehát:
    mezo[i].OnSelectCell:=Sajat_SelectCell; // paraméterek NÉLKÜL

    A többi rész viszont változatlan, tehát a Sajat_SelectCell eljárást szigorúan a definiálandó eljárás paraméterlistájával (OnSelectCell) deklarálni és definiálni (kifejteni) kell.

    procedure TForm1.Sajat_SelectCell(Sender: TObject; ACol,
    ARow: Integer; var CanSelect: Boolean);

    Meghíváskor át kell adni a paramétereket is!
    Pl. mezo[1].OnSelectCell(Sender,1,1,bValtozo);
    Figyelj rá hogy a 4. paraméternek logikai változónak kell lennie a "VAR" miatt!
    Ez át fog irányítódni a form Sajat_SelectCell eljárásába és továbbadja a paramétereket is. Viszont a Sajat_SelectCell-t meg kell írni !!! Tehát le kell reagálni a cella kiválasztódás eseményét, ha nem írsz bele semmit akkor ilyenkor nem fog történni semmi. Legalábbis úgy gondolom, mert ezt sem próbáltam ki. :)

  • Fire/SOUL/CD

    félisten

    válasz Yodafon #1723 üzenetére

    Hali!

    Oks, akkor figyu. Írd le légyszives, hogy mit szeretnél megvalósítani, de sima hétköznapi nyelven. pl
    "Ha rákattintok a stringgrid1-re, akkor formázza le a HDD-t, ha meg a stringgrid2-re, akkor elötte kérdezze is meg, hogy leformázhatja-e...." :DDD

    Szívesen segítek, de most elvesztettem a fonalat pl ezért:

    "Pont azt szeretném elkerülni hogy minden mezönek saját SelectCell-je legyen."
    A TStringGrid objektunak nincs ilyen tulajdonsága, függvénye, procedúrája, stb
    onSelectCell eseménye(event) az van, na ezt meg nem a programozó dönti el, hogy az objektummal létrejöjjön-e vagy sem. Csak azt, hogy felprogramozod vagy sem.

    Szóval hétköznapi nyelven írd le, hogy mit szeretnél, abból majd rájövök(remélem) :DDD

    Fire.

  • Fire/SOUL/CD

    félisten

    válasz Yodafon #1720 üzenetére

    Hali!

    vz12 leírta helyesen hogy mire kell odafigyelni.

    Valamint szigorúan "eredeti" paraméterlistával:

    procedure TForm1.Sajat_SelectCell(Sender: TObject; ACol,
    ARow: Integer; var CanSelect: Boolean);

    Én annyival egészíteném ki, hogy mivel nevet is adtam az objektumoknak(stringgrid1, stringgrid2, stb) ezért van, hogy nem "akármilyen néven" hivatkozok rá(StringGrid1SelectedCell, StringGrid2SelectedCell)
    Valamint a progi kilépésekor fel kell szabadítani az objektumokat.
    Gyakorlatban ilyen a kód.

    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, Grids, StdCtrls;

    type
    TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
    var CanSelect: Boolean);
    procedure StringGrid2SelectCell(Sender: TObject; ACol, ARow: Integer;
    var CanSelect: Boolean);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    private
    { Private declarations }
    public
    { Public declarations }
    end;

    var
    Form1: TForm1;
    mezo:array[1..2] of TStringGrid;

    implementation

    {$R *.dfm}

    procedure TForm1.FormCreate(Sender: TObject);
    var
    i:Integer;
    begin
    for i:=1 to 2 do begin
    mezo[i]:=TStringGrid.Create(Self);
    mezo[i].Parent:=Form1;
    mezo[i].Name:='StringGrid'+IntToStr(i);
    end;

    mezo[1].Top:=20;
    mezo[1].Left:=50;
    mezo[1].FixedCols:=0;
    mezo[1].FixedRows:=0;
    mezo[1].ColCount:=3;
    mezo[1].RowCount:=3;
    mezo[1].DefaultColWidth:=20;
    mezo[1].DefaultRowHeight:=20;
    mezo[1].Ctl3D:=false;
    mezo[1].Width:=64;
    mezo[1].Height:=64;
    mezo[1].ScrollBars:=ssNone;
    mezo[1].OnSelectCell:=StringGrid1SelectCell;

    mezo[2].Top:=200;
    mezo[2].Left:=120;
    mezo[2].FixedCols:=0;
    mezo[2].FixedRows:=0;
    mezo[2].ColCount:=3;
    mezo[2].RowCount:=3;
    mezo[2].DefaultColWidth:=20;
    mezo[2].DefaultRowHeight:=20;
    mezo[2].Ctl3D:=false;
    mezo[2].Width:=64;
    mezo[2].Height:=64;
    mezo[2].ScrollBars:=ssNone;
    mezo[2].OnSelectCell:=StringGrid2SelectCell;

    end;

    procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
    ARow: Integer; var CanSelect: Boolean);
    begin
    ShowMessage('Első grid');
    end;

    procedure TForm1.StringGrid2SelectCell(Sender: TObject; ACol,
    ARow: Integer; var CanSelect: Boolean);
    begin
    ShowMessage('Második grid');
    end;

    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    var
    i:Integer;
    begin
    for i:=1 to 2 do begin
    mezo[i].Free;
    end;
    end;

    end.

    Fire.

  • vz12

    tag

    válasz Yodafon #1720 üzenetére

    Próbáld meg valahogy így:

    mezo[1].SelectCell:=Sajat_SelectCell; // paraméterek NÉLKÜL

    mezo[2].SelectCell:=Sajat_SelectCell; // paraméterek NÉLKÜL

    Valamint szigorúan "eredeti" paraméterlistával:

    procedure TForm1.Sajat_SelectCell(Sender: TObject; ACol,
    ARow: Integer; var CanSelect: Boolean);

    Ezt a deklarációs résszel összhangban a kódba is bele kell tenni (természetesen ott kifejtve).

    Hozzáteszem hogy nem próbáltam ki, ezen a gépen nincs Delphi sem, de elvileg így kell és ez gyakorlatilag semmiben nem különbözik a "normál" esettől, annak jobb könyvekben benne kell lennie.

    Ha már ilyen előrelátó módon tömbbe szervezted az objektumokat akkor azok közös adatait (itt majdnem mind az) én a ciklusban inicializáltam volna a "parent"-hez hasonlóan, tehát pl. mezo[i].Top:=20;

  • Fire/SOUL/CD

    félisten

    válasz Yodafon #1718 üzenetére

    Hali!

    Mondjuk az a "csak több dimenzióban" nem igazán tudom mire gondolsz... :F

    Esetleg, hogy egy tartományt (range) jelölsz ki, azaz több cellát, és azon akarsz valamilyen műveletet végezni?

    Ha esetleg erre akkor így lehet példul:

    procedure TForm1.StringGrid1MouseUp(Sender: TObject; Button: TMouseButton;
    Shift: TShiftState; X, Y: Integer);
    begin
    ShowMessage(
    'A kiválasztott tartomány kezdőcellája(x,y):'+
    IntToStr(StringGrid1.Selection.Left)+','+IntToStr(StringGrid1.Selection.Top)+
    Char(13)+'A kiválasztott tartomány utolsó cellája(x,y):'+
    IntToStr(StringGrid1.Selection.Right)+','+IntToStr(StringGrid1.Selection.Bottom)
    );

    end;

    Fire.

  • Fire/SOUL/CD

    félisten

    válasz Yodafon #1713 üzenetére

    Hali!

    Arra tudok gondolni, hogy egy másik unit-ban van a kódod, nem a pl Form1-t tartalmazó unit-ban.

    Az a lényeg, hogy ebben a unit-ba használd a StdCtrls unit-ot, mivel ebben vannak deklarálva a Scrollbar konstansok (ssNone, ssBoth, ssVertical, ssHorizontal)

    uses StdCtrls

    Fire.

Új hozzászólás Aktív témák

Hirdetés