Ú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ÜLHelyesen 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ÜLA 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. -
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...."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)
Fire.
-
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;
-
válasz
Yodafon #1718 üzenetére
Hali!
Mondjuk az a "csak több dimenzióban" nem igazán tudom mire gondolsz...
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.
-
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
- iKing.Hu - Apple iPhone 14 Pro Max Stílusos erő, Pro kamera rendszerrel! 128GB - 3 hónap gari!
- Lenovo ThinkPad T480, T580, P51s, P52s, T480s belső akkumulátor eladó
- MacBook Pro M2 Pro 16 // 16/512 96%-os akkumulátor
- Dell Latitude 5580 üzleti notebook i5/16GB/256GB 1 év garancia
- EarFun Air Pro 3 White
- ÁRGARANCIA!Épített KomPhone i7 14700KF 32/64GB RAM RX 9070 XT 16GB GAMER PC termékbeszámítással
- BESZÁMÍTÁS! ASUS TUF VG27AQ 165Hz QHD IPS 1ms monitor garanciával hibátlan működéssel
- GYÖNYÖRŰ iPhone 13 512GB Starlight -1 ÉV GARANCIA - Kártyafüggetlen, MS3077, 100% Akkumulátor
- HP Omen 80G8E9 - 27" IPS - UHD 4K - 144Hz 1ms - NVIDIA G-Sync - FreeSync - HDR 400 - USB Type-C
- AKCIÓ! Apple MacBook Pro 13 2022 M2 8GB 256GB SSD garanciával hibátlan működéssel
Állásajánlatok
Cég: FOTC
Város: Budapest