İşaretci ile erişme sorunu

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
boreas
Üye
Mesajlar: 120
Kayıt: 05 Tem 2007 12:39
Konum: Ankara

İşaretci ile erişme sorunu

Mesaj gönderen boreas »

Freepascal'da aşağıdaki gibi bir kodum var

Kod: Tümünü seç

  Tdata = record
    graf: TLineSeries;
    source: TListChartSource;
    pgraf :  ^TLineSeries;
    psource : ^TListChartSource;  
  end;
    ts: array of Tdata;
 
SetLength(ts,ts_count+1);
 ts[ts_count].graf:=TlineSeries.Create(Chart1);
 ts[ts_count].Pgraf:= @ts[ts_count].Graf;
 ts[ts_count].source:=TListChartSource.Create(self);  
 ts[ts_count].psource:= @ts[ts_count].source;  
 
Seriyi oluşturmada ve data atamada sorun yaşamıyorum.

Ama pointer aracılığıyla ulaşmaya kalktığımda array'ın sadece son üyesine ulaşabiliyorum. Diğerlerinde sürekli hata verip çökme yapıyor. Ama en son eklediğim grafiğe erişmekde sorun yaşamıyorum.

Atladığım hata nedir yardımcı olursanız çok memnun olurum.
....
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2356
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: İşaretci ile erişme sorunu

Mesaj gönderen freeman35 »

Array yerine tlist kullan. ts_count ne? nerde atama yapıyorsun ? bu index değerini takip et.
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
boreas
Üye
Mesajlar: 120
Kayıt: 05 Tem 2007 12:39
Konum: Ankara

Re: İşaretci ile erişme sorunu

Mesaj gönderen boreas »

Tscount'da ya da array kısmında sorunum yok. Zaten sistem çalışıyor. Benim sorunum dinamik array'den bir element sildiğimde kalan elemenleri bir yukarı taşıyorum ve son elementi siliyorum. Ama bu taşıma esnasında tlineseries ve tlistchartsource 'u taşıyamıyorum.
yani ;
index silinecek eleman ts_count arrayin uzunluğu
5 elemanlı bir listede 3.sü silinecekse 3.nün yerine 4 ü, 4'ün yerine 5i getirip 5inciyi siliyorum.

Kod: Tümünü seç

 for i:=index to ts_count+1 do begin
      ts[index].Baslik := ts[index+1].Baslik;
      ts[index].cdj := ts[index+1].cdj;
      ts[index].comm := ts[index+1].comm;
      ts[index].dosya := ts[index+1].dosya;
      ts[index].formul := ts[index+1].formul;
      ts[index].f_sure := ts[index+1].f_sure;
      ts[index].kalibre := ts[index+1].kalibre;
      ts[index].run := ts[index+1].run;
      ts[index].sensor := ts[index+1].sensor;
      ts[index].seri := ts[index+1].seri;
      ts[index].sira := ts[index+1].sira;
      ts[index].sure := ts[index+1].sure;
      ts[index].tip := ts[index+1].tip;
      ts[index].Grafik:=ts[index+1].Grafik; // Tlineseries için böyle bir eşleme olmuyor
      ts[index].Kaynak:=ts[index+1].Kaynak;

    end;
  ts[ts_count].Grafik.Free;
  ts[ts_count].Kaynak.Free;
  SetLength(ts,ts_count-1);
  ts_count:=ts_count -1;    

    
....
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2356
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: İşaretci ile erişme sorunu

Mesaj gönderen freeman35 »

ts_count yerine lenght(array) kullanmak daha mantıklı.
ts: array of Tdata; senin record un zaten tdata, Tdata yı taşımak yerine neden tdatanın içeriğini taşıyorsun?
Hala Tlist kullan diyorum.
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
boreas
Üye
Mesajlar: 120
Kayıt: 05 Tem 2007 12:39
Konum: Ankara

Re: İşaretci ile erişme sorunu

Mesaj gönderen boreas »

Tlist'i böyle bir veri için nasıl kullanabilir bilmiyorum ? Move işlemiyle tdata yı taşımaya çalışıyorum ama onda da farklı hatalar aldığım için bu yönteme yoğunlaştım.

Kod: Tümünü seç

move(ts[index+1],ts[index+1],sizeof(Tgraf)*(ts_count-index));  
....
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2356
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: İşaretci ile erişme sorunu

Mesaj gönderen freeman35 »

TList.create; TList.add(); TList.remove insert vs help te detayları vardır, fpc de yoksa delphi de yada web de detayları mutlaka vardır
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
boreas
Üye
Mesajlar: 120
Kayıt: 05 Tem 2007 12:39
Konum: Ankara

Re: İşaretci ile erişme sorunu

Mesaj gönderen boreas »

Tlisti biliyorum. Demek istediğim şu bu arrayın her parçasında bir grafik tablosunun (TAchart)'ın lineseries bileşeni tanımlı. Yani her array kaydında bir tbutton bileşeni kayıtlı gibi düşün. Bunu tliste nasıl yapabilirim onu anlaşım değilim.
....
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: İşaretci ile erişme sorunu

Mesaj gönderen SimaWB »

FIFO tarzı bir listeye ihtiyacın varsa TQueue yada TObjectQueue'yi deneyebilirsin.
There's no place like 127.0.0.1
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2356
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: İşaretci ile erişme sorunu

Mesaj gönderen freeman35 »

boreas yazdı:Tlisti biliyorum. Demek istediğim şu bu arrayın her parçasında bir grafik tablosunun (TAchart)'ın lineseries bileşeni tanımlı. Yani her array kaydında bir tbutton bileşeni kayıtlı gibi düşün. Bunu tliste nasıl yapabilirim onu anlaşım değilim.
biliyorsun madem:

Kod: Tümünü seç

Pdata:  ^Tdata;
I:= myTlist.Add(new(TData));
PData:= tdata(myTList[I]));
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: İşaretci ile erişme sorunu

Mesaj gönderen ertank »

@boreas, öncelikle ilk gönderdiğiniz record yapısı ile ikinci gönderdiğiniz kod örneği içinden yola çıkılarak elde edilen record yapısı uyumsuz.

Sorununuz bir class türünü basit bir değişken gibi eşleştirmeye çalışmaktan kaynaklı diye düşünüyorum. Grafik eşleştirmesini ve muhtemelen Kaynak eşleştirmesini aşağıdakine benzer bir yöntem ile yapmayı deneyebilirsiniz.

Kod: Tümünü seç

  ts[index].Grafik.Assign(ts[index+1].Grafik);
class türleri kendi iç OnCreate() kodlarında hafızadan yer ayırıp ayırmayacağı veya hafızanın neresinden yer ayırıp kullanacağını bilemediğimiz için hafıza bloğu kaydırma (move) veya eşittir gibi atamalar ile kullanmak doğru değildir.
boreas
Üye
Mesajlar: 120
Kayıt: 05 Tem 2007 12:39
Konum: Ankara

Re: İşaretci ile erişme sorunu

Mesaj gönderen boreas »

Yasadigim sorun tam olarak bu. İlk kod anlasilir olsun diye daha basitti. 2.kod esas yazdigim yazilim. Suan reccord yapisindan class turlerini cikarip onlar yerine isaretci kullanarak sorunumu cozdum. Herkese yardimlari icin tesekkur ederim. Tlist icin freeman e ayrica tesekkurler
....
Cevapla