[elektro-etc] Delphi kérdés
Papp Zoltán
zombi at c2.hu
Wed Dec 5 23:26:48 CET 2007
2007.12.05. 19:10:25 dátumon Friedrich Gábor <igazifido at t-online.hu> írta:
> Sziasztok!
> Formon van 8 Memo, a progi indításakor mind a 8 memo szövegét törölni
> szeretném, valahogy így:
>
> procedure TForm1.FormActivate(Sender: TObject); //vagy akár FormCreate..
> var
> x: byte;
> begin
> for x:=1 to 8 do Memo[x].Text:='';
> end;
>
> Erre azt mondja, hogy Undeclared Identifier: 'Memo'.
> Amúgy ha egyenként hivatkozok rá (Memo1.Text:='') akkor működik.
> Mi a gond?
> Előre is köszi.
> Üdv
> Fidó
Hali!
Ha programozás közben a Form létrehozásakor kijelölöd a Memox ojjektumot,
és az "Object Inspector"-ban a "Lines" paraméter végén lévő pici gombócra
ráböksz, akkor tudod szerkeszteni a Memo induláskori tartalmát. Ha ezt itt
kitörlöd, akkor üresen fognak létrejönni a Memó-id.
Ha törölni akarsz egy Memo-t, akkor: Memox.Lines.Clear; avagy még
egyszerűbben: Memox.Clear; (ez a
Ha viszont tömbként akarsz hivatkozni rájuk, akkor a következőt teheted:
1)
Létrehozod a 8 Memot, Memo1, Memo2, ... Memo8 néven.
A Form-od "private" deklarációjában csinálsz pl. egy ilyet:
Memos: array[1..8] of TMemo;
Ezzel létrehozol egy objektum tömböt. (Valójában csak mutatókat definiálsz)
Majd a Form-od OnCreate eseményéhez rendelt eljáráson belül
(alapértelmezésben: TForm1.FormCreate):
Memos[1]:=Memo1;
Memos[2]:=Memo2;
...
Memos[8]:=Memo8;
Ezzel a tömb-mutatóid a 8 Memora fognak mutatni.
Innentől kezdve a Memo1-re hivatkozhatsz Memos[1] névvel is.
pl.: Memos[1].Clear;
2)
A Memo-kat te hozod létre a programon belül és nem a
vizuális-szerkesztőben:
Egyszerű példa: csinálj egy új projektet, mentsd el a unitot "memosu.pas"
néven, a projektet "memos.dpr" néven.
A Form1-et állítsd be kb. 850x250-es méretre.
Másold be itt a lenti cuccot a memosu.pas-ba:
//=======================================
unit memosu;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure MemosOnClick(Sender: TObject); //esemény a Memos-hoz
private
Memos: array[1..8] of TMemo;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var i:byte;
begin
for i:=1 to 8 do
begin
Memos[i]:=TMemo.Create(Form1); //Memo lefoglalása a memóriában
with Memos[i] do
begin
Parent:=Form1; //ez a Memo a Form1-hez tartozik
Left:=i*100-92; //koordináták és méretek beállítása
Top:=8;
Width:=92;
Height:=150;
TabOrder:=i; //Tabulátor-sorrend
OnClick:=MemosOnClick; //ha ráklikkentünk, akkor a MemosOnClick
eljárás hívása
end;
end;
end;
procedure TForm1.MemosOnClick(Sender: TObject);
var Memox:TMemo;
begin
Memox:=TMemo(Sender); //Memox fog arra a Memo-ra mutatni, amelyik
meghívta az eljárást, sajna a "typecasting" muszáj
Memox.Lines.Add('Click'); //innentől kezdve a Memox-el érjük el az adott
objektumot
end;
//=======================================
A program létrehoz 8 Memo-t egymás mellett, 92x150-es mérettel.
Ezekre későbbiekben hivatkozhatsz Memos[i] névvel.
Ha külön-külön akarsz esemény-eljárásokat beállítani, akkor a fenti
példában pl. a Memos[i].OnClick eseményre hozz létre külön eljárásokat.
Ha egyben akarod kezelni az eseményeket az összes Memo-n, akkor a fenti
példa az irányadó.
Ott látod azt is, hogyan lehet úgy munkát végeztetni a Memo-kkal, hogy azt
sem tudod, melyik hívta meg az eljárást.
Ha meg akarod tudni, vagy annak megfelelően egy eljáráson belül több
dolgot elvégezni, akkor így módosíthatod a MemosOnClick eljárást:
procedure TForm1.MemosOnClick(Sender: TObject);
var i:byte;
begin
for i:=1 to 8 do
if Sender=Memos[i] then
Memos[i].Lines.Add('Click'+IntToStr(i));
end;
Így az i-be kerül a meghívó Memo "sorszáma"
Remélem nem volt túl bonyolult.
Üdv
--
Papp Zoltán
OneWay Electronics - www.onewayelectronics.hu
Hangszerviz - www.hangszerviz.hu
More information about the Elektro-etc
mailing list