[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