Šta je novo?

Delphi array kontrole... Hica !!!

Neo_Matrix

Čuven
Učlanjen(a)
12.08.2003
Poruke
1,262
Poena
649
Kako da u Delphiju dajem imena labelima sa indexom (kao array) da bi posle mogo u ciklusu da ih pozivam npr. u VB-u je labelpera[1]...

Kako to uraditi u delphiju...
 
treba mi da se kontrole zovu npr
Label[1], label[2],..., label[10]
Pa kad hocu da ucitam iz nekog tekstualnog fajla u labelove da stavim :

for I:=1 to 10 do
Begin
readln(pera, a);
label :=a;
end;

Nadam se da sad kontas...
 
Malo naslucujem sta si hteo da kazes... malo si u ovom orimeru pomesao pascal i delphi, al ajd...

probaj da iz ovog ovde koda izvuces sta ti treba... on ucitava u listbox, a ne u labele, medjutim moci ces verovatno da se snadjes...

[code:1]
unit Form1;

interface

uses
SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, Menus, ImgList;

type
TForm1 = class(TForm)
ListView1: TListView;
MainMenu1: TMainMenu;
File1: TMenuItem;
Exit1: TMenuItem;
View1: TMenuItem;
LargeIcons1: TMenuItem;
SmallIcons1: TMenuItem;
List1: TMenuItem;
Details1: TMenuItem;
Help1: TMenuItem;
About1: TMenuItem;
N1: TMenuItem;
CheckBoxes1: TMenuItem;
ImagesLarge: TImageList;
ImagesSmall: TImageList;
procedure FormCreate(Sender: TObject);
procedure LargeIcons1Click(Sender: TObject);
procedure SmallIcons1Click(Sender: TObject);
procedure List1Click(Sender: TObject);
procedure Details1Click(Sender: TObject);
procedure Exit1Click(Sender: TObject);
procedure About1Click(Sender: TObject);
procedure CheckBoxes1Click(Sender: TObject);
procedure ListView1ColumnClick(Sender: TObject; Column: TListColumn);
procedure ListView1Compare(Sender: TObject; Item1, Item2: TListItem;
Data: Integer; var Compare: Integer);
procedure ListView1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormDestroy(Sender: TObject);
public
{ Public declarations }
private
nSortCol: Integer;
end;

var
Form1: TForm1;

implementation

{$R *.DFM}
{$R BITMAPS.RES}

procedure TForm1.FormCreate(Sender: TObject);
var
List: TStringList;
NewItem: TListItem;
I: Integer;
begin
// stops warning message
NewItem := nil;

// load the items
ListView1.Items.Clear;
List := TStringList.Create;
try
List.LoadFromFile (
ExtractFilePath (Application.ExeName) + 'Items.txt');
for I := 0 to List.Count - 1 do
if List [1] = #9 then
NewItem.SubItems.Add (Trim (List ))
else if List [1] = '@' then
NewItem.ImageIndex := StrToIntDef (List [2], 0)
else
begin
// a new item
NewItem := ListView1.Items.Add;
NewItem.Caption := List ;
end;
finally
List.Free;
end;
end;

procedure TForm1.LargeIcons1Click(Sender: TObject);
begin
ListView1.ViewStyle := vsIcon;
LargeIcons1.Checked := True;
end;

procedure TForm1.SmallIcons1Click(Sender: TObject);
begin
ListView1.ViewStyle := vsSmallIcon;
SmallIcons1.Checked := True;
end;

procedure TForm1.List1Click(Sender: TObject);
begin
ListView1.ViewStyle := vsList;
List1.Checked := True;
end;

procedure TForm1.Details1Click(Sender: TObject);
begin
ListView1.ViewStyle := vsReport;
Details1.Checked := True;
end;

procedure TForm1.Exit1Click(Sender: TObject);
begin
Close;
end;


procedure TForm1.CheckBoxes1Click(Sender: TObject);
begin
ListView1.Checkboxes :=
not ListView1.Checkboxes;
CheckBoxes1.Checked :=
not CheckBoxes1.Checked;
end;

procedure TForm1.ListView1ColumnClick(Sender: TObject;
Column: TListColumn);
begin
nSortCol := Column.Index;
ListView1.AlphaSort;
end;

procedure TForm1.ListView1Compare(Sender: TObject;
Item1, Item2: TListItem;
Data: Integer; var Compare: Integer);
begin
if nSortCol = 0 then
Compare := CompareStr (Item1.Caption, Item2.Caption)
else
Compare := CompareStr (Item1.SubItems [nSortCol - 1],
Item2.SubItems [nSortCol - 1]);
end;

procedure TForm1.ListView1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
strDescr: string;
I: Integer;
begin
// if there is a selected item
if ListView1.Selected <> nil then
if Button = mbLeft then
begin
// create and show a description
strDescr := ListView1.Columns [0].Caption + #9 +
ListView1.Selected.Caption + #13;
for I := 1 to ListView1.Selected.SubItems.Count do
strDescr := strDescr + ListView1.Columns .Caption + #9 +
ListView1.Selected.SubItems [I-1] + #13;
ShowMessage (strDescr);
end
else if Button = mbRight then
// edit the caption
ListView1.Selected.EditCaption;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
I, J: Integer;
List: TStringList;
begin
// store the items
List := TStringList.Create;
try
for I := 0 to ListView1.Items.Count - 1 do
begin
// save the caption
List.Add (ListView1.Items.Caption);
// save the index
List.Add ('@' + IntToStr (ListView1.Items.ImageIndex));
// save the subitems (indented)
for J := 0 to ListView1.Items.SubItems.Count - 1 do
List.Add (#9 + ListView1.Items.SubItems [J]);
end;
List.SaveToFile (
ExtractFilePAth (Application.ExeName) + 'Items.txt');
finally
List.Free;
end;
end;

end.
[/code:1]

Nemoj da te zbune ove bitmape...one su samo deo liste... pozdrav
 
Hvala na kodu, ali nije pomogao... Znam kako da radim sa listom kad imam item[1],..., ali kad imam label-e onda nemam ono [1] i nemogu da kazem label... Pa me zanima kako da nazovem label-e da mogu da im dajem imena u ciklusima... Verovatno postoji neka oznaka, a ako ne postoji onda postoji neka caka...

I dalje mi je mnogo hitna pomoc ???

Hvala !!!
 
Ok ako ti nije pomoglo... Ti verovatno trazis nacin da obelezis te labele nekako...:)

Koliko ja znam, to ne moze, znaci moze samo label1, label2 itd.. medjutim ako mozes da se strpis do sutra mozda pronadjem odgovor ako postoji...
 
Pa definisi ih kao array[1..n] of TLabel. Po otvaranju forme (recimo OnCreate) ili prilikom ucitavanja mozes da ih kreiras sa klasicnim:

[code:1]
for i:=1 to n do
begin
MyLabel := TLabel.Create(self);
MyLabel.Parent := self;
MyLabel.Left
MyLabel.Width
...
end;
[/code:1]

Napomena: primer korsti 'self' za owner tih labela, sto znaci da sam pretpostavljao da se taj array deklarise u okviru definicije forme, recim u public sekciji.
 
Hvala Silvere, to sam trazio...
Imam jos jedno pitanjce koje glasi "Kako da namestim da mi se program startuje sa windowsom... Znam sa kopiranjem precice u c\Windows\startUp (Win98) ili C:\Documents...
Ali postoji nacin ubacivanjem kljuca u registry, pa ako ima neko iskustva neka kaze da ne otvaram novu temu...

Poz...
 
E, da jos nesto me zanima u vezi sa temom ovog topica... Kreiram kontrole, dam im captione i sve, ali neznam kako da napisem Event on Mylabel[1]click ???
Pokusao sam sa klasicnim (TForm1.MyLabelClick(sender :TObject);), ali neradi...

Silvere Help, a i ostali ???

I jos jedno pod pitanje kako da definisem niz kao array[1..n], pa iz programa definisem koliko je n, a ne da pretpostavljam 100, 1000,... Ovo postoji u VB-u, pa me zanima postoji li u Delphiju i kako se radi ???

Poz.
 
Neo_Matrix je napisao(la):
Imam jos jedno pitanjce koje glasi "Kako da namestim da mi se program startuje sa windowsom... Znam sa kopiranjem precice u c\Windows\startUp (Win98) ili C:\Documents...
Ali postoji nacin ubacivanjem kljuca u registry, pa ako ima neko iskustva neka kaze da ne otvaram novu temu...

Poz...

trebalo bi da je ovako (mrzi me da palim delphi):

[code:1]
var
Reg: TRegistry;
begin
Reg := TRegistry.Create;
Reg.RootKey := HKEY_LOCAL_MACHINE;
Reg.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Run', False);
Reg.WriteString('MojProgram', 'C:\Projects\MojProgram.exe');
Reg.CloseKey;
Reg.Free;
end;
[/code:1]
 
Hvala, mene ne mrzi da palim Delphi pa cu sad da probam, a da li neko zna kako da napisem Event on Mylabel[1]click ???

Hvala!!!
 
Pa to ti je bar osnovno; u toj istoj formi (recimo u private sekciji) definises svoju neku proceduru, recimo OnMyLabelClick(Sender: TObject) - ime moze biti bilo kakvo, vazno je da je broj i struktura parametara potpuno ista kao u OnClick eventu. Zatim napises implementaciju tog MyForm.OnMyLabelClick eventa. I tamo lepo gde kreiras labele, samo dodelis ovu proceduru onclick eventu (fakticki dodeljujes pointer na proceduru):

[code:1]
for i:=1 to n do
begin
MyLabel := TLabel.Create(self);
MyLabel.Parent := self;
MyLabel.Left
MyLabel.Width
...
MyLabel.OnClick := OnMyLabelClick;
...
end;
[/code:1]

Dakle, mozes da napravis vise procedura koje rade razlicite stvari i dodelis tako pointer tih procedura OnClick propertyju onim labelima za koje hoces da tako reaguju. Onim labelima za koje neces da reaguju uopste na OnClick jednostavno ne dodelis nista.
 
Silvere, hvala jos jednom, sad radi i Event onclick...
U ovom tredu sam postavio nekoliko pitanja i za sva sam dobio odgovore, samo jos da li je moguce i kako da gornju granicu niza (array[1..gornjagranica] definisem iz PRG-a...

@xvoodoo Za registry radi, hvala i samo jos da mi kazes za koje Win-ove to radi...???

10x
 
Ovako kao obican array ne mozes iz programa da definises promenjivu gornju granicu (osim kao konstantu). Zato sto za array (kao staticki tip) mora kompajler vec u trenutku kompajliranja da zna tacnu velicinu da bi rezervisao tacno odredjenu kolicinu memorije za array.

Za varijabilni niz mozes da se izvuces na vise drugih nacina koristeci dinamicke tipove:
1. koristeci liste - imas gotove TList klase u koje vezes svoje TLabel komponente; TLabeli se kreiraju kao gore, samo se dodaju u TList varijablu
2. koristeci TCollection - opisao sam to malo u jednom drugom skorasnjem threadu; napravi se klasa koja nasledjuje TCollectionItem tako da sadrzi TLabel i onda se oni vezu u TCollection
3. koristeci OpenArray (ukucaj to u help, pa ce ti se kasti samo)

Ovo za registry ce raditi bez problema na win9x platformama, a da bi radilo svuda, promeni RootKey u HKEY_CURRENT_USER, jer nemaju mozda svi juzeri prava da pristupaju HKEY_LOCAL_MACHINE.
 
silverglider je napisao(la):
Ovo za registry ce raditi bez problema na win9x platformama, a da bi radilo svuda, promeni RootKey u HKEY_CURRENT_USER, jer nemaju mozda svi juzeri prava da pristupaju HKEY_LOCAL_MACHINE.

upravo zato sam i stavio lokalnu mashinu, jer win9x nema gotovo nikakvu kontrolu korisnika, a pod NT-om ionako samo juzeri sa statusom administratora mogu da brljaju po windowsu...
 
Nazad
Vrh Dno