bileşene array tipinde özellik eklemek?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
cfyasar
Üye
Mesajlar: 169
Kayıt: 31 Oca 2005 05:18
Konum: izmir

bileşene array tipinde özellik eklemek?

Mesaj gönderen cfyasar »

Listbox bileşenine dizi tipinde bir özellik eklemeye çalıştım ama olmadı. denediğim kod parçası şöyle:

Kod: Tümünü seç

TMyListBox =class(TListBox)
  private
    FData,FStatus: word;
    FFontNo:byte;
    FMyItems:array [0..255] of word;
  public
    property MyItems[index:word]:word read FMyItems write FMyItems;
    property FontNo:byte read FFontNo write FFontNo;
    property Data:word read FData write FData;
    property Status:word read FStatus write FStatus;
end;
öğrenmek, zorlukları yenmektir.
gorecelik
Üye
Mesajlar: 23
Kayıt: 27 Nis 2005 02:59
Konum: İstanbul
İletişim:

Re: bileşene array tipinde özellik eklemek?

Mesaj gönderen gorecelik »

Kod: Tümünü seç

TMyListBox =class(TListBox)
  private
    FData,FStatus: word;
    FFontNo:byte;
    FMyItems:array [0..255] of word;
  public
    property MyItems[index:word]:word read FMyItems write FMyItems; // sorun burda
    property FontNo:byte read FFontNo write FFontNo;
    property Data:word read FData write FData;
    property Status:word read FStatus write FStatus;
end;
bu şekilde çalışır

Kod: Tümünü seç

TMyListBox =class(TListBox)
  private
    FData,FStatus: word;
    FFontNo:byte;
    FMyItems:array [0..255] of word;
  public
    property MyItems:array [0..255] of word read FMyItems write FMyItems; // sorun burda
    property FontNo:byte read FFontNo write FFontNo;
    property Data:word read FData write FData;
    property Status:word read FStatus write FStatus;
end;
sebebi FMyItems değişkenini Array olarak tanımlamışsın MyItems değerini ise
property MyItems[index:word]:word
bu şekilde tanımlamışsın açıkça söylemek gerekirse ben böyle tanımlamayı ilk defa görüyorum :D muhtemelen iki tane hata verir birincisi MyItems nasıl tanımladın ben böyle bişey bilmiyorum der ikincisi ise eğer ben böyle bir tanımlama türü biliyorsam hatan şurda bu tanımlamaya tutmuşsun Array değer atmışsın der yani bu şuna benzer
var
xxx: integer;
yyy: string;
begin
yyy := xxx;
end;

gibi bişey demişsin oda çalışmaz tabi türleri değişik değişkenleri birbirlerine atamışsın .

kolay gelsin.
t-hex
Kıdemli Üye
Mesajlar: 531
Kayıt: 18 Mar 2005 02:45
Konum: İstanbul/Antalya
İletişim:

Mesaj gönderen t-hex »

Merhaba,

Kod: Tümünü seç

property MyItems:array [0..255] of word read FMyItems write FMyItems; // sorun burda 
Öncelikle belirteyimki benim bildiğim kadarıyla property'lerde bu şekilde array tanımlanamaz, zaten bu kodda hata verdi.

@cfyasar arkadaşımın yazdığı kodda doğruya yakın ama eksik, getter ve setter belirtmemiş, şu şekilde olmalı :

Kod: Tümünü seç

TMyListBox =class(TListBox)
  private
    FData,FStatus: word;
    FFontNo:byte;
    FMyItems:array [0..255] of word;
  protected
    function GetMyItems(index: word): word;
    procedure SetMyItems(index: word; const Value: word);
  public
    property MyItems[index:word]:word read GetMyItems write SetMyItems;
    property FontNo:byte read FFontNo write FFontNo;
    property Data:word read FData write FData;
    property Status:word read FStatus write FStatus;
end;
direk array üzerinde değişiklik yaptıramazsın ama onun yerine bu işi yapacak getter ve setter metodları yazmalısın, zaten class'ı yazarken Ctrl+Shift+C tuşlarına bastığında Delphi bunları senin için ekleyecektir.

Kolay gelsin
Kullanıcı avatarı
vedatkaba
Kıdemli Üye
Mesajlar: 866
Kayıt: 06 Oca 2004 06:50
Konum: DARICA/GEBZE

Mesaj gönderen vedatkaba »

peki bunu nasıl ve nerelerde kullanırız ...
***********************************
Kamil odur ki; koya dünyada bir eser,
Eseri olmayanın, yerinde yeller eser.

***********************************
t-hex
Kıdemli Üye
Mesajlar: 531
Kayıt: 18 Mar 2005 02:45
Konum: İstanbul/Antalya
İletişim:

Mesaj gönderen t-hex »

Merhaba,

Bu yöntemi yazdığınız her tür class da kullanabilirsiz, delphiden örnek vermek gerekirse, TStringList class'ında Lines propertysi bu tiptendir.

Kod: Tümünü seç

var
 strList : TStringList;
begin
...
  ShowMessage(strList.Lines[0]);
...
end;
Dahada detaya inersek, bu tipte tanımladığınız bir özelliği

Kod: Tümünü seç

var
 strList : TStringList;
begin
...
  ShowMessage(strList[0]);
...
end;
şeklinde kullanmak isterseniz
kodu şöyle değiştirirsiniz o zaman derleyici özellik adı belirtmediğinizde hangisi kullanmak istediğinizi anlayabilir.

Kod: Tümünü seç

property MyItems[index:word]:word read GetMyItems write SetMyItems;default;
Benzer örnekleri için TList sınıfı incelenebilir. Ayrıca bu yöntem muhtelif dillerde indexer olarak geçer. C++ ve c#'da. javada bulunmamaktadır. zaten javada property kavramı yoktur. operator overloading de yoktur. for each bile yoktu!!!
Kullanıcı avatarı
cfyasar
Üye
Mesajlar: 169
Kayıt: 31 Oca 2005 05:18
Konum: izmir

Mesaj gönderen cfyasar »

sorun şöyle çözüldü.

Kod: Tümünü seç

TMyListBox =class(TListBox)
  private
    FData,FStatus: word;
    FFontNo:byte;
    FDataList:array[1..255] of word;
  protected
    function GetDataList(index:byte):word;
    procedure SetDataList(index:byte; const value:word);
  public
    property DataList[index:byte]:word read GetDataList write SetDataList;
    property FontNo:byte read FFontNo write FFontNo;
    property Data:word read FData write FData;
    property Status:word read FStatus write FStatus;
  end;


function TMyListBox.GetDataList(index: byte): word;
begin
   Result:=FDataList[index];
end;

procedure TMyListBox.SetDataList(index:byte; const value:word);
begin
   if FDataList[index]<>value then
   begin
      FDataList[index]:=value;
      update;
   end;
end;
kolay gelsin.
öğrenmek, zorlukları yenmektir.
Cevapla