Delphi Can

Orjinalini görmek için tıklayınız: Delphi 10.4.2 Listview Problemi
Şu anda (Arşiv) modunu görüntülemektesiniz. Orjinal Sürümü Görüntüle internal link
Sayfalar: 1 2
Daha önceki bütün sürümlerde çalışan kod çalışmıyor daha doğrusu text ile ilgili kodlar hata vermiyor ancak listede yazılar görünmüyor. item çizgileri var yazılar yok. Renkleri, fontları, visible'ları, genişlikleri, yükseklikleri herşeyi değiştirdim yine yazılar görünmüyor.

ikinci bir problem de yine aşağıdaki kodlarda         indirimOlustur(LItem,LImage);  ResimOlustur(LItem,LImage,'resim',150,150); komutlarında access violation hatası veriyor.


procedure datayaekle( ListView:TListView);
Procedure ObjectOlustur( AItem:TListViewItem; LItem: TListItemText; strRefKod, strText:String; iOffsetX, iOffsetY, iWidth,iHeight, iFontSize:Integer; iFontColor: LongInt; bool:Boolean ;iFontStyle: TFontStyles; iAlign : TTextAlign);
begin
   LItem                := TListItemText.Create(AItem);
   LItem.Name           := strRefKod;
   LItem.Font.Size      := iFontSize;
   LItem.TextColor      := iFontColor;
   LItem.Align          := TListItemAlign.Center; // En Sol
   LItem.VertAlign      := TListItemAlign.Leading; // En Üst
   LItem.PlaceOffset.X  := iOffsetX;
   LItem.PlaceOffset.Y  := iOffsetY;
   LItem.TextAlign      := iAlign;
   LItem.Trimming       := TTextTrimming.ttCharacter;
   LItem.IsDetailText   := False;
   LItem.Width          := iWidth;
   LItem.Height         := iHeight;
   LItem.Text           := strText;
   LItem.Visible        := bool;
   LItem.Font.Style     := iFontStyle;
//    LItem.WordWrap := True;
end;

procedure ResimOlustur( AItem:TListViewItem; LImage: TListItemImage; risim:string; irWidth,irHeight:Integer);
begin
 LImage := TListItemImage.Create(AItem);
 LImage.Name := risim; //'Resim';
 LImage.Align := TListItemAlign.Center; // En Sağ
 LImage.VertAlign := TListItemAlign.Leading; // Orta
 LImage.PlaceOffset.X := 20;
 LImage.PlaceOffset.Y := 70;
 LImage.Width := irWidth; //200;
 LImage.Height := irHeight;//200;
 LImage.OwnsBitmap := True;
 LImage.Bitmap := TBitmap.Create(0, 0);
 LImage.Bitmap := resimdata;
end;

Procedure indirimOlustur(AItem: TListViewItem; LImage: TListItemImage);
Begin
 LImage := TListItemImage.Create(AItem);
 LImage.Name := 'yazi';
 LImage.Align := TListItemAlign.Leading;
 LImage.VertAlign := TListItemAlign.Center;
 LImage.PlaceOffset.Y := 0;
 LImage.PlaceOffset.X := 12;
 LImage.Width := 100;
 LImage.Height := 100;
 LImage.OwnsBitmap := True;
 LImage.Bitmap := TBitmap.Create(0, 0);
 Limage.Bitmap := indres;
End;

Var
 litem   : TListViewItem;
 LImage  : TListItemImage;
 MS : TMemoryStream;
 LData,LLabel,LResim : Array[1..26] of TListItemText;

begin
   if ad <> '' then
   begin
     litem := ListView.Items.Add;
     litem.Height := 350;
     litem.Text   := '';

        indirimOlustur(LItem,LImage);
        ResimOlustur(LItem,LImage,'resim',150,150);

       ObjectOlustur( LItem, LData[1], 'Data1' , veri1 , 0, 300,  0, 20, 12, TAlphaColorRec.Red, True, [],TTextAlign.Center );
       ObjectOlustur( LItem, LData[2], 'Data2' , veri2 , 4,  30,  0, 20, 12, TAlphaColorRec.Black, True,[],TTextAlign.Center );
       ObjectOlustur( LItem, LData[3], 'Data3' , veri3 , 0, 260,  0, 25, 13, TAlphaColorRec.Red, True, [Tfontstyle.fsStrikeOut], TTextAlign.Center);
       ObjectOlustur( LItem, LData[4], 'Data4' , veri4, 40, 160,  0, 40, 20, TAlphaColorRec.White, True,[],TTextAlign.Leading );
       ObjectOlustur( LItem, LData[5], 'Data5' , veri5 ,  0,   0,  0,  0,  0, TAlphaColorRec.Black, False,[],TTextAlign.Leading);
       ObjectOlustur( LItem, LData[6], 'Data6' , veri6 ,  0, 280,  0, 20, 17, TAlphaColorRec.Black, True, [Tfontstyle.fsBold],TTextAlign.Center);
    end;
end;
Boş bir proje oluşturup bunda dener misiniz?
(04-08-2021, Saat: 20:29)engerex Adlı Kullanıcıdan Alıntı: [ -> ]Boş bir proje oluşturup bunda dener misiniz?

Buraya yazmadan denemiştim. İnternette araştırdım. Başka yollar da denedim. Örneğin
     litem := ListView.Items.Add;
     litem.Height := 350;
    litem.data['text1]   := 'Deneme';
    litem.data['text2]   := 'test';

ya da

multidetail.detail1 := 'deneme'
multidetail.detail2 := 'test'

     

text ile olan sadece son yazılanı yazıyor.
multidetail'de sadece 3 tane eklenebiliyor.
Text alanı ile ilgili bir düzenleme yapmışlar ama ne olduğunu çözemedim.
Aynı problem delphi 11'de de mevcut. (Yani yazılar gelmiyor) Kimse kullanmıyor mu bu kodları?
Buna ek olarak Delphi 11
ObjectOlustur( LItem, LData[1], 'Data1' , veri1 , 0, 300, 0, 20, 12, TAlphaColorRec.Red, True, [],TTextAlign.Center ); Satırı için Range Check Error hatasını da ekledi.
Merhaba.. Geciken cevap için üzgünüm

Delphi FMX altyapısını yeni kurduğu dönemlerden kalma ürettiğim bir çözümdü bu kodlar.

ListView yerine ListBox kullanımını öneriyorum aslında ama sizin için inceledim Delphi ListView yapısındaki değişimi inceledim.

Çözüm için en alt satıra şunu ekleyin.

   AItem.Objects.Add(LItem);


Önceleri Create içerisine Item'i verdiğinizde Object içine otomatik eklenirken, yeni sistemde bunu kullanıcıya bırakmışlar olduğunu anlıyorum.

   LItem                := TListItemText.Create(nil);
   LItem.Name           := strRefKod;
   LItem.Font.Size      := iFontSize;
   LItem.TextColor      := iFontColor;
   LItem.Align          := TListItemAlign.Leading; // En Sol
   LItem.VertAlign      := TListItemAlign.Leading; // En Üst
   LItem.PlaceOffset.X  := iOffsetX;
   LItem.PlaceOffset.Y  := iOffsetY;
   LItem.TextAlign      := TTextAlign.taLeading;
   LItem.Trimming       := TTextTrimming.ttCharacter;
   LItem.IsDetailText   := True;
   LItem.Width          := iWidth;
   LItem.Height         := iHeight;
   LItem.Text           := strText;
   AItem.Objects.Add(LItem);


Başarılar.

Eski bir metod olsa da merak edenler için bir örnek proje hazırladım.

Örnekte DelphiCan RSS ile XML formatındaki ilk 15 başlığı alarak ListView'de gösteren, bu içerikten herhangi birine tıklayınca varsayılan browser ile açıp gösteren giriş seviyesi minik bir proje.

Örnekten edinilebilecek bilgiler :
  • Bir web sitesine erişim yapılarak içeriğinin alınması. (örnekte XML içerik geliyor)
  • TIdHttp Indy kullanımı yerine THTTPClient kullanımı ile SSL kütüphaneleri gereği olmadan siteye SSL erişim imkanı.
  • XML içerik veri okuma yöntemleri
  • WEB Tarih / Saat verisinin yerel tarih saate dönüştürme
  • Record yapıları
  • Array ( dizi ) yapıları
  • Android / MSWindows şartlı kod yazımı
  • Class ( Sınıf ) oluşturma ve kullanma 
Kaynak kodları aşağıda bulabilir ve inceleyebilirsiniz.

Hem android hem de windows uyumlu FMX projedir.
Forma (2) tane TButon, (1) tane de TListView bırakmanız deneme için yeterlidir. Birinci buton listeyi dolduru ikincisi formu kapatır.

Main Form :


Uses
{$IF Defined(ANDROID)}
  FMX.Platform.Android,
{$ENDIF}
  DelphiCanHelperU;

var
  FDelphiCan : TDelphiCanHelper;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if NOT Assigned(FDelphiCan) then
  begin
    FDelphiCan  := TDelphiCanHelper.Create;
    FDelphiCan.ListView     := ListView1;
  end;
  FDelphiCan.DoBrowse();
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  // Bizim Close()'un Android karşılığı...
  // USES FMX.Platform.Android
  // MainActivity.Finish();
{$IF Defined(ANDROID)}
  FMX.Platform.Android.MainActivity.finish();
{$ENDIF}
{$IF Defined(MSWINDOWS)}
  Close;
{$ENDIF}
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if Assigned(FDelphiCan)
    then FreeAndNil(FDelphiCan)
end;




Uses ile eklenecek Helper Unit :


unit DelphiCanHelperU;

interface

Uses  System.SysUtils, System.Classes, System.Types, System.UITypes,
      FMX.Dialogs,
      FMX.StdCtrls, FMX.Types, FMX.Graphics,
      FMX.ListView, FMX.ListView.Types, FMX.ListView.Appearances, FMX.ListView.Adapters.Base,
    {$IF Defined(ANDROID)}
      Androidapi.JNI.GraphicsContentViewText,
      Androidapi.JNI.App,
      Androidapi.JNI.Net,
      Androidapi.Helpers,
    {$ENDIF}
    {$IF Defined(MSWINDOWS)}
      WinApi.Windows, WinApi.ShellApi,
    {$ENDIF}
      System.Net.HTTPClient,
      IDGlobalProtocols,
      XMLIntf, XMLDoc,
      System.DateUtils;

type
   TDelphiCanHelper = Class( TObject )
   private
     const
       FURL       = 'https://www.delphican.com/syndication.php?limit=15';
       FImageUrl  = 'http://www.delphistudio.es/img/delphi/dp-01.png';

    Type
      TGuid = Record
        isPermaLink : boolean;
        text        : string;
      End;
      TItemRecord = record
        Title,
        Link,
        Desc,
        ContEnco: String;
        PubDate : TDateTime;
        Guid    : TGuid;
      end;

      TDelphiCanRecord = Record
        Title,
        Link,
        Desc    : String;
        PubDate : TDateTime;
        Items   : Array of TItemRecord;
      End;

     var
       FNetClient : THTTPClient;
       FListView  : TListView;
       FDelphiCan : TDelphiCanRecord;

     procedure ListViewItemClick(const Sender: TObject; const AItem: TListViewItem);
     procedure ParseData( aXMLData: String );
     procedure PrepareListView;
     procedure SetListView(Value: TListView);
   public
     constructor  Create;
     destructor   Destroy; override;
     property     ListView    : TListView     read FListView write SetListView;
     procedure    DoBrowse;
   End;
implementation

{ TDelphiCanHelper }

constructor TDelphiCanHelper.Create;
begin
  inherited;
  FNetClient    := THTTPClient.Create;
end;

destructor TDelphiCanHelper.Destroy;
begin
  FreeAndNil(FNetClient);
  Finalize(FDelphiCan);
  inherited;
end;
procedure TDelphiCanHelper.DoBrowse;
var
  LSS   : TStringStream;
  LStat : Integer;
begin
  LSS   := TStringStream.Create( '', TEncoding.UTF8 );
  try
    LStat := FNetClient.Get(FURL, LSS).StatusCode;
    if LStat = 200 then
    begin
      ParseData( LSS.DataString );
      PrepareListView();
    end;
  finally
    FreeAndNil(LSS);
  end;
end;

procedure TDelphiCanHelper.ParseData( aXMLData: String );
var
  LDoc        : IXMLDocument;
  LNode       : IXMLNode;
  LData       : IXMLNode;
  LDate       : String;

  LItem       : TItemRecord;
begin
  LDoc := LoadXMLData( aXmlData );
  if LDoc <> nil then
  try
    LNode := LDoc.DocumentElement;    // rss
    LNode := LNode.ChildNodes.First;  // channel

    Finalize(FDelphiCan);

    if LNode.ChildNodes.FindNode('title') <> nil
      then FDelphiCan.Title   := LNode.ChildNodes.FindNode('title').NodeValue;
    if LNode.ChildNodes.FindNode('link') <> nil
      then FDelphiCan.Link    := LNode.ChildNodes.FindNode('link').NodeValue;
    if LNode.ChildNodes.FindNode('description') <> nil
      then FDelphiCan.Desc    := LNode.ChildNodes.FindNode('description').NodeValue;
    if LNode.ChildNodes.FindNode('pubDate') <> nil
      then begin
        LDate  := LNode.ChildNodes.FindNode('pubDate').NodeValue;
        FDelphiCan.PubDate := IDGlobalProtocols.StrInternetToDateTime( LDate );
        FDelphiCan.PubDate := TTimeZone.Local.ToLocalTime( FDelphiCan.PubDate );
      end;

    LData := LNode.ChildNodes.FindNode('item');
    while LData <> nil do
    begin
      LItem := default(TItemRecord);

      if LData.ChildNodes.FindNode('title') <> nil
        then LItem.Title    := LData.ChildNodes.FindNode('title').NodeValue;
      if LData.ChildNodes.FindNode('link') <> nil
        then LItem.Link     := LData.ChildNodes.FindNode('link').NodeValue;
      if LData.ChildNodes.FindNode('pubDate') <> nil
        then begin
          LDate  := LData.ChildNodes.FindNode('pubDate').NodeValue;
          LItem.PubDate := IDGlobalProtocols.StrInternetToDateTime( LDate );
          LItem.PubDate := TTimeZone.Local.ToLocalTime( FDelphiCan.PubDate );
        end;
      if LData.ChildNodes.FindNode('guid') <> nil
        then begin
          if LData.AttributeNodes.FindNode('isPermaLink') <> nil
            then LItem.Guid.isPermaLink := LData.AttributeNodes.FindNode('isPermaLink').NodeValue;
          LItem.Guid.text   := LData.ChildNodes.FindNode('guid').Text;
        end;
      if LData.ChildNodes.FindNode('description') <> nil
        then LItem.Desc     := LData.ChildNodes.FindNode('description').NodeValue;
      if LData.ChildNodes.FindNode('content:encoded') <> nil
        then LItem.ContEnco := LData.ChildNodes.FindNode('content:encoded').NodeValue;

      SetLength( FDelphiCan.Items, Length(FDelphiCan.Items)+1 );
      FDelphiCan.Items[high(FDelphiCan.Items)] := LItem;

      LData := LData.NextSibling;
    end;
  finally
    LDoc := Nil;
  end;
end;

procedure TDelphiCanHelper.PrepareListView;
  Procedure ObjectOlustur( AItem:TListViewItem; var LItem: TListItemText; strRefKod, strText:String; iOffsetX, iOffsetY, iWidth,iHeight, iFontSize:Integer; iFontColor: Cardinal );
  begin
    LItem                := TListItemText.Create(nil);
    LItem.Name           := strRefKod;
    LItem.Font.Size      := iFontSize;
    LItem.TextColor      := iFontColor;
    LItem.Align          := TListItemAlign.Leading; // En Sol
    LItem.VertAlign      := TListItemAlign.Leading; // En Üst
    LItem.PlaceOffset.X  := iOffsetX;
    LItem.PlaceOffset.Y  := iOffsetY;
    LItem.TextAlign      := TTextAlign.Leading;
    LItem.Trimming       := TTextTrimming.Character;
    LItem.IsDetailText   := True;
    LItem.Width          := iWidth;
    LItem.Height         := iHeight;
    LItem.Text           := strText;
    AItem.Objects.Add(LItem);
end;

Var
  AItem   : TListViewItem;
  LImage  : TListItemImage;
  LData1,  LData2,  LData3,  LData4,
  LLabel1, LLabel2, LLabel3  : TListItemText;
  MS      : TMemoryStream;
  i       : Integer;
begin
  ListView.Items.Clear;

  for i := Low(FDelphiCan.Items) to High(FDelphiCan.Items) do
  begin

    AItem := ListView.Items.Add;
    AItem.Height := 132;
    AItem.Text   := '';

    LImage                  := TListItemImage.Create(nil);
    LImage.Name             := 'Resim';
    LImage.Align            := TListItemAlign.Trailing; // En Sağ
    LImage.VertAlign        := TListItemAlign.Center;   // Orta
    LImage.PlaceOffset.Y    := 2;
    LImage.PlaceOffset.X    := 0;
    LImage.Width            := 90;
    LImage.Height           := 128;
    LImage.OwnsBitmap       := True;
    LImage.Bitmap           := FMX.Graphics.TBitmap.Create(0, 0);
    AItem.Objects.Add(LImage);

    MS := TMemoryStream.Create;
      FNetClient.Get( FImageUrl, MS);
      MS.Seek(0,soFromBeginning);
      LImage.Bitmap.LoadFromStream(MS);
    MS.Free;

  // Başlıklar
  // -----------------------------------------------------------------------------
    ObjectOlustur( AItem, LLabel1, 'Bas1', 'Title:', 4, 20, 500, 20, 12, TAlphaColorRec.Maroon );
    ObjectOlustur( AItem, LLabel2, 'Bas2', 'PubDt:', 4, 40, 500, 20, 8, TAlphaColorRec.Black );
    ObjectOlustur( AItem, LLabel3, 'Bas3', 'Auth.:', 4, 60, 500, 20, 8, TAlphaColorRec.Black );
  // Veri Alanları
  // -----------------------------------------------------------------------------
    ObjectOlustur( AItem, LData1, 'Data1', FDelphiCan.Items[i].Title,       54,  20, 500, 20, 12, TAlphaColorRec.Maroon );
    ObjectOlustur( AItem, LData2, 'Data2', DateTimeToStr(FDelphiCan.Items[i].PubDate),
                                                                            54,  40, 500, 20, 8, TAlphaColorRec.Black );
    ObjectOlustur( AItem, LData3, 'Data3', 'Author',                        54,  60, 500, 20, 8, TAlphaColorRec.Black );
    ObjectOlustur( AItem, LData4, 'Data4', FDelphiCan.Items[i].Link,        04, 100, 500, 20, 12, TAlphaColorRec.Black );
  end; // While
end;

procedure TDelphiCanHelper.SetListView(Value: TListView);
begin
  FListView := Value;
  FListView.OnItemClick := ListViewItemClick;
end;

procedure TDelphiCanHelper.ListViewItemClick(const Sender: TObject;
  const AItem: TListViewItem);
var
{$IF Defined(ANDROID)}
  Intent : JIntent; // Androidapi.JNI.GraphicsContentViewText
{$ENDIF}
  LURL : String;
begin
  LURL := (AItem.Objects.FindDrawable('Data4') as TListItemText).Text;
{$IF Defined(ANDROID)}
  Intent := TJIntent.Create;
  Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);
  Intent.setData(StrToJURI( LURL ));
  TAndroidHelper.Activity.startActivity(Intent);
{$ENDIF}
{$IF Defined(MSWINDOWS)}
  ShellExecute(HInstance, 'open', PChar(LUrl), nil, nil, SW_NORMAL);
{$ENDIF}
end;

end.





pc1gzvfgvoaxgme7vnck.gif
(13-02-2022, Saat: 13:17)mrmarman Adlı Kullanıcıdan Alıntı: [ -> ]Merhaba.. Geciken cevap için üzgünüm

Delphi FMX altyapısını yeni kurduğu dönemlerden kalma ürettiğim bir çözümdü bu kodlar.

ListView yerine ListBox kullanımını öneriyorum aslında ama sizin için inceledim Delphi ListView yapısındaki değişimi inceledim.

Çözüm için en alt satıra şunu ekleyin.

   AItem.Objects.Add(LItem);


Önceleri Create içerisine Item'i verdiğinizde Object içine otomatik eklenirken, yeni sistemde bunu kullanıcıya bırakmışlar olduğunu anlıyorum.

   LItem                := TListItemText.Create(nil);
   LItem.Name           := strRefKod;
   LItem.Font.Size      := iFontSize;
   LItem.TextColor      := iFontColor;
   LItem.Align          := TListItemAlign.Leading; // En Sol
   LItem.VertAlign      := TListItemAlign.Leading; // En Üst
   LItem.PlaceOffset.X  := iOffsetX;
   LItem.PlaceOffset.Y  := iOffsetY;
   LItem.TextAlign      := TTextAlign.taLeading;
   LItem.Trimming       := TTextTrimming.ttCharacter;
   LItem.IsDetailText   := True;
   LItem.Width          := iWidth;
   LItem.Height         := iHeight;
   LItem.Text           := strText;
   AItem.Objects.Add(LItem);


Başarılar.

Eski bir metod olsa da merak edenler için bir örnek proje hazırladım.

Örnekte DelphiCan RSS ile XML formatındaki ilk 15 başlığı alarak ListView'de gösteren, bu içerikten herhangi birine tıklayınca varsayılan browser ile açıp gösteren giriş seviyesi minik bir proje.

Örnekten edinilebilecek bilgiler :
  • Bir web sitesine erişim yapılarak içeriğinin alınması. (örnekte XML içerik geliyor)
  • TIdHttp Indy kullanımı yerine THTTPClient kullanımı ile SSL kütüphaneleri gereği olmadan siteye SSL erişim imkanı.
  • XML içerik veri okuma yöntemleri
  • WEB Tarih / Saat verisinin yerel tarih saate dönüştürme
  • Record yapıları
  • Array ( dizi ) yapıları
  • Android / MSWindows şartlı kod yazımı
  • Class ( Sınıf ) oluşturma ve kullanma 
Kaynak kodları aşağıda bulabilir ve inceleyebilirsiniz.

Hem android hem de windows uyumlu FMX projedir.
Forma (2) tane TButon, (1) tane de TListView bırakmanız deneme için yeterlidir. Birinci buton listeyi dolduru ikincisi formu kapatır.

Main Form :


Uses
{$IF Defined(ANDROID)}
  FMX.Platform.Android,
{$ENDIF}
  DelphiCanHelperU;

var
  FDelphiCan : TDelphiCanHelper;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if NOT Assigned(FDelphiCan) then
  begin
    FDelphiCan  := TDelphiCanHelper.Create;
    FDelphiCan.ListView     := ListView1;
  end;
  FDelphiCan.DoBrowse();
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  // Bizim Close()'un Android karşılığı...
  // USES FMX.Platform.Android
  // MainActivity.Finish();
{$IF Defined(ANDROID)}
  FMX.Platform.Android.MainActivity.finish();
{$ENDIF}
{$IF Defined(MSWINDOWS)}
  Close;
{$ENDIF}
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if Assigned(FDelphiCan)
    then FreeAndNil(FDelphiCan)
end;




Uses ile eklenecek Helper Unit :

unit DelphiCanHelperU;

interface

Uses  System.SysUtils, System.Classes, System.Types, System.UITypes,
      FMX.Dialogs,
      FMX.StdCtrls, FMX.Types, FMX.Graphics,
      FMX.ListView, FMX.ListView.Types, FMX.ListView.Appearances, FMX.ListView.Adapters.Base,
    {$IF Defined(ANDROID)}
      Androidapi.JNI.GraphicsContentViewText,
      Androidapi.JNI.App,
      Androidapi.JNI.Net,
      Androidapi.Helpers,
    {$ENDIF}
    {$IF Defined(MSWINDOWS)}
      WinApi.Windows, WinApi.ShellApi,
    {$ENDIF}
      System.Net.HTTPClient,
      IDGlobalProtocols,
      XMLIntf, XMLDoc,
      System.DateUtils;

type
   TDelphiCanHelper = Class( TObject )
   private
     const
       FURL = 'https://www.delphican.com/syndication.php?limit=15';

    Type
      TGuid = Record
        isPermaLink : boolean;
        text        : string;
      End;
      TItemRecord = record
        Title,
        Link,
        Desc,
        ContEnco: String;
        PubDate : TDateTime;
        Guid    : TGuid;
      end;

      TDelphiCanRecord = Record
        Title,
        Link,
        Desc    : String;
        PubDate : TDateTime;
        Items   : Array of TItemRecord;
      End;

     var
       FNetClient : THTTPClient;
       FListView  : TListView;
       FDelphiCan : TDelphiCanRecord;

     procedure ListViewItemClick(const Sender: TObject; const AItem: TListViewItem);
     procedure ParseData( aXMLData: String );
     procedure PrepareListView;
     procedure SetListView(Value: TListView);
   public
     constructor  Create;
     destructor   Destroy; override;
     property     ListView    : TListView     read FListView write SetListView;
     procedure    DoBrowse;
   End;
implementation

{ TDelphiCanHelper }

constructor TDelphiCanHelper.Create;
begin
  inherited;
  FNetClient    := THTTPClient.Create;
end;

destructor TDelphiCanHelper.Destroy;
begin
  FreeAndNil(FNetClient);
  Finalize(FDelphiCan);
  inherited;
end;
procedure TDelphiCanHelper.DoBrowse;
var
  LSS   : TStringStream;
  LStat : Integer;
begin
  LSS   := TStringStream.Create( '', TEncoding.UTF8 );
  try
    LStat := FNetClient.Get(FURL, LSS).StatusCode;
    if LStat = 200 then
    begin
      ParseData( LSS.DataString );
      PrepareListView();
    end;
  finally
    FreeAndNil(LSS);
  end;
end;

procedure TDelphiCanHelper.ParseData( aXMLData: String );
var
  LDoc        : IXMLDocument;
  LNode       : IXMLNode;
  LData       : IXMLNode;
  LDate       : String;

  LItem       : TItemRecord;
begin
  LDoc := LoadXMLData( aXmlData );
  if LDoc <> nil then
  try
    LNode := LDoc.DocumentElement;    // rss
    LNode := LNode.ChildNodes.First;  // channel

    Finalize(FDelphiCan);

    if LNode.ChildNodes.FindNode('title') <> nil
      then FDelphiCan.Title   := LNode.ChildNodes.FindNode('title').NodeValue;
    if LNode.ChildNodes.FindNode('link') <> nil
      then FDelphiCan.Link    := LNode.ChildNodes.FindNode('link').NodeValue;
    if LNode.ChildNodes.FindNode('description') <> nil
      then FDelphiCan.Desc    := LNode.ChildNodes.FindNode('description').NodeValue;
    if LNode.ChildNodes.FindNode('pubDate') <> nil
      then begin
        LDate  := LNode.ChildNodes.FindNode('pubDate').NodeValue;
        FDelphiCan.PubDate := IDGlobalProtocols.StrInternetToDateTime( LDate );
        FDelphiCan.PubDate := TTimeZone.Local.ToLocalTime( FDelphiCan.PubDate );
      end;

    LData := LNode.ChildNodes.FindNode('item');
    while LData <> nil do
    begin
      LItem := default(TItemRecord);

      if LData.ChildNodes.FindNode('title') <> nil
        then LItem.Title    := LData.ChildNodes.FindNode('title').NodeValue;
      if LData.ChildNodes.FindNode('link') <> nil
        then LItem.Link     := LData.ChildNodes.FindNode('link').NodeValue;
      if LData.ChildNodes.FindNode('pubDate') <> nil
        then begin
          LDate  := LData.ChildNodes.FindNode('pubDate').NodeValue;
          LItem.PubDate := IDGlobalProtocols.StrInternetToDateTime( LDate );
          LItem.PubDate := TTimeZone.Local.ToLocalTime( FDelphiCan.PubDate );
        end;
      if LData.ChildNodes.FindNode('guid') <> nil
        then begin
          if LData.AttributeNodes.FindNode('isPermaLink') <> nil
            then LItem.Guid.isPermaLink := LData.AttributeNodes.FindNode('isPermaLink').NodeValue;
          LItem.Guid.text   := LData.ChildNodes.FindNode('guid').Text;
        end;
      if LData.ChildNodes.FindNode('description') <> nil
        then LItem.Desc     := LData.ChildNodes.FindNode('description').NodeValue;
      if LData.ChildNodes.FindNode('content:encoded') <> nil
        then LItem.ContEnco := LData.ChildNodes.FindNode('content:encoded').NodeValue;

      SetLength( FDelphiCan.Items, Length(FDelphiCan.Items)+1 );
      FDelphiCan.Items[high(FDelphiCan.Items)] := LItem;

      LData := LData.NextSibling;
    end;
  finally
    LDoc := Nil;
  end;
end;

procedure TDelphiCanHelper.PrepareListView;
  Procedure ObjectOlustur( AItem:TListViewItem; var LItem: TListItemText; strRefKod, strText:String; iOffsetX, iOffsetY, iWidth,iHeight, iFontSize:Integer; iFontColor: Cardinal );
  begin
    LItem                := TListItemText.Create(nil);
    LItem.Name           := strRefKod;
    LItem.Font.Size      := iFontSize;
    LItem.TextColor      := iFontColor;
    LItem.Align          := TListItemAlign.Leading; // En Sol
    LItem.VertAlign      := TListItemAlign.Leading; // En Üst
    LItem.PlaceOffset.X  := iOffsetX;
    LItem.PlaceOffset.Y  := iOffsetY;
    LItem.TextAlign      := TTextAlign.Leading;
    LItem.Trimming       := TTextTrimming.Character;
    LItem.IsDetailText   := True;
    LItem.Width          := iWidth;
    LItem.Height         := iHeight;
    LItem.Text           := strText;
    AItem.Objects.Add(LItem);
end;

Var
  AItem   : TListViewItem;
  LImage  : TListItemImage;
  LData1,  LData2,  LData3,  LData4,
  LLabel1, LLabel2, LLabel3  : TListItemText;
//MS      : TMemoryStream;
  i       : Integer;
begin
  ListView.Items.Clear;

  for i := Low(FDelphiCan.Items) to High(FDelphiCan.Items) do
  begin

    AItem := ListView.Items.Add;
    AItem.Height := 132;
    AItem.Text   := '';

    LImage                  := TListItemImage.Create(AItem);
    LImage.Name             := 'Resim';
    LImage.Align            := TListItemAlign.Trailing; // En Sağ
    LImage.VertAlign        := TListItemAlign.Center;   // Orta
    LImage.PlaceOffset.Y    := 2;
    LImage.PlaceOffset.X    := 0;
    LImage.Width            := 90;
    LImage.Height           := 128;
    LImage.OwnsBitmap       := True;
    LImage.Bitmap           := FMX.Graphics.TBitmap.Create(0, 0);
    {
    MS := TMemoryStream.Create;
      FNetClient.Get(Bilgi.strDescription, MS);
      MS.Seek(0,soFromBeginning);
      LImage.Bitmap.LoadFromStream(MS);
    MS.Free;
    }

  // Başlıklar
  // -----------------------------------------------------------------------------
    ObjectOlustur( AItem, LLabel1, 'Bas1', 'Title:', 4, 20, 500, 20, 12, TAlphaColorRec.Maroon );
    ObjectOlustur( AItem, LLabel2, 'Bas2', 'PubDt:', 4, 40, 500, 20, 8, TAlphaColorRec.Black );
    ObjectOlustur( AItem, LLabel3, 'Bas3', 'Auth.:', 4, 60, 500, 20, 8, TAlphaColorRec.Black );
  // Veri Alanları
  // -----------------------------------------------------------------------------
    ObjectOlustur( AItem, LData1, 'Data1', FDelphiCan.Items[i].Title,       54,  20, 500, 20, 12, TAlphaColorRec.Maroon );
    ObjectOlustur( AItem, LData2, 'Data2', DateTimeToStr(FDelphiCan.Items[i].PubDate),
                                                                            54,  40, 500, 20, 8, TAlphaColorRec.Black );
    ObjectOlustur( AItem, LData3, 'Data3', 'Author',                        54,  60, 500, 20, 8, TAlphaColorRec.Black );
    ObjectOlustur( AItem, LData4, 'Data4', FDelphiCan.Items[i].Link,        04, 100, 500, 20, 12, TAlphaColorRec.Black );
  end; // While
end;

procedure TDelphiCanHelper.SetListView(Value: TListView);
begin
  FListView := Value;
  FListView.OnItemClick := ListViewItemClick;
end;

procedure TDelphiCanHelper.ListViewItemClick(const Sender: TObject;
  const AItem: TListViewItem);
var
{$IF Defined(ANDROID)}
  Intent : JIntent; // Androidapi.JNI.GraphicsContentViewText
{$ENDIF}
  LURL : String;
begin
  LURL := (AItem.Objects.FindDrawable('Data4') as TListItemText).Text;
{$IF Defined(ANDROID)}
  Intent := TJIntent.Create;
  Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);
  Intent.setData(StrToJURI( LURL ));
  TAndroidHelper.Activity.startActivity(Intent);
{$ENDIF}
{$IF Defined(MSWINDOWS)}
  ShellExecute(HInstance, 'open', PChar(LUrl), nil, nil, SW_NORMAL);
{$ENDIF}
end;

end.





hvhlfdcqnjoj9hb9db2t.gif
Hocam çok çok teşekkür ederim. Listview düzenleme konusunda daha iyi kod görmedim. Önerilen hep DynamicAppearance ile yapılması ama o yöntem insanı kanser ediyor çünkü bir yerde mutlaka access violation hatasını veriyor.
Eksik olma.
FMX mimarisinin emekleme aşamalarında Binding olayına bir türlü ısınamadığımdan her şeyi el yordamı ile yapmaya gayret ediyor olduk.
Bu kod örneği de zamanında FMX platform source klasöründeki unitler alt üst edilerek ortaya çıktı.
Bu gibi kod yapılarında gelecekte bir güncelleme olduğunda (buradaki örnekte olduğu gibi) oluşan hata/ olumsuzluk takibi kolay oluyor ve ilgili kısma odaklanıp gereken çözüm üretilebiliyor.

ListBox konusunda da ısrarım, Windows ortamında multiselect / drag drop vb. durumlarda daha esnek olduğundandır. Onda da sistem daha çok stylebook odaklı bir yapıya evrildi.

Çalışmalarınızda başarılar.
TListItemImage.Create(AItem);

yerine

TListItemImage.Create(nil);

dener misiniz...


    LImage                  := TListItemImage.Create(nil);
    LImage.Name             := 'Resim';
    LImage.Align            := TListItemAlign.Trailing; // En Sağ
    LImage.VertAlign        := TListItemAlign.Center;   // Orta
    LImage.PlaceOffset.Y    := 2;
    LImage.PlaceOffset.X    := 0;
    LImage.Width            := 90;
    LImage.Height           := 128;
    LImage.OwnsBitmap       := True;
    LImage.Bitmap           := FMX.Graphics.TBitmap.Create(0, 0);
    AItem.Objects.Add(LImage);



pc1gzvfgvoaxgme7vnck.gif




NOT : Bir de sizin "resimdata" içeriğinde resim gerçekten var mı onu da kontrol etmenizi salık verebilirim.

Sistemin çalıştığını test için şöyle yapabilirsiniz.

const
  FImageUrl  = 'http://www.delphistudio.es/img/delphi/dp-01.png';
...
...
...

    LImage                  := TListItemImage.Create(nil);
    LImage.Name             := 'Resim';
    LImage.Align            := TListItemAlign.Trailing; // En Sağ
    LImage.VertAlign        := TListItemAlign.Center;   // Orta
    LImage.PlaceOffset.Y    := 2;
    LImage.PlaceOffset.X    := 0;
    LImage.Width            := 90;
    LImage.Height           := 128;
    LImage.OwnsBitmap       := True;
    LImage.Bitmap           := FMX.Graphics.TBitmap.Create(0, 0);
    AItem.Objects.Add(LImage);

    MS := TMemoryStream.Create;
      FNetClient.Get( FImageUrl, MS);
      MS.Seek(0,soFromBeginning);
      LImage.Bitmap.LoadFromStream(MS);
    MS.Free;

(14-02-2022, Saat: 17:04)mrmarman Adlı Kullanıcıdan Alıntı: [ -> ]Eksik olma.
FMX mimarisinin emekleme aşamalarında Binding olayına bir türlü ısınamadığımdan her şeyi el yordamı ile yapmaya gayret ediyor olduk.
Bu kod örneği de zamanında FMX platform source klasöründeki unitler alt üst edilerek ortaya çıktı.
Bu gibi kod yapılarında gelecekte bir güncelleme olduğunda (buradaki örnekte olduğu gibi) oluşan hata/ olumsuzluk takibi kolay oluyor ve ilgili kısma odaklanıp gereken çözüm üretilebiliyor.

ListBox konusunda da ısrarım, Windows ortamında multiselect / drag drop vb. durumlarda daha esnek olduğundandır. Onda da sistem daha çok stylebook odaklı bir yapıya evrildi.

Çalışmalarınızda başarılar.

Hocam bu defa da resim göstermiyordu. Prosedur ekleyip yapınca oldu. Bu yapı çok çok kullanışlı ve pratik. Listbox'la da denemeler yaptım. Açıkcası çok içime sinmedi. Bu yolla her şeyi yapabiliyorum. Tekrar çok çok teşekkür ederim.

Saygılarımla;

procedure datayaekle( ListView:TListView);
Procedure ObjectOlustur( AItem:TListViewItem; LItem: TListItemText; strRefKod, strText:String; iOffsetX, iOffsetY, iWidth, iHeight, iFontSize:Integer; iFontColor: LongInt;bool:Boolean);
begin
   LItem                := TListItemText.Create(AItem);
   LItem.Text           := strText;
   LItem.Name           := strRefKod;
   LItem.Font.Size      := iFontSize;
   LItem.TextColor      := iFontColor;
   LItem.Align          := TListItemAlign.Center; // En Sol
   LItem.VertAlign      := TListItemAlign.Leading; // En Üst
   LItem.PlaceOffset.X  := iOffsetX;
   LItem.PlaceOffset.Y  := iOffsetY;
   LItem.TextAlign      := TTextAlign.Center;
   LItem.Trimming       := TTextTrimming.Character;
   LItem.IsDetailText   := False;
   LItem.Width          := iWidth;
   LItem.Height         := iHeight;
   LItem.Visible        := bool;
   LItem.WordWrap := True;
   AItem.Objects.Add(LItem);
end;


Procedure ResimOlustur( AItem:TListViewItem; LImage: TListItemImage);
begin
 LImage := TListItemImage.Create(AItem);
 LImage.Name := 'Resim';
 LImage.Align := TListItemAlign.Center; // En Sağ
 LImage.VertAlign := TListItemAlign.Leading; // Orta
 LImage.PlaceOffset.X := 0;
 LImage.PlaceOffset.Y := 50;
 LImage.Width := 150;
 LImage.Height := 150;
 LImage.OwnsBitmap := True;
 LImage.Bitmap := FMX.Graphics.TBitmap.Create(0, 0);
 LImage.Bitmap := resimdata;
 LImage.Visible := True;
 AItem.Objects.Add(LImage);
end;

 Var
 AItem   : TListViewItem;
 LImage  : TListItemImage;
 MS : TMemoryStream;
 LData,LLabel,LResim : Array[1..26] of TListItemText;

 begin
   if ad <> '' then
   begin
     AItem := ListView.Items.Add;
     AItem.Height := 250;
     AItem.Text   := '';


     // Başlıklar
     // -----------------------------------------------------------------------------
//        ObjectOlustur( LItem, LLabel[1], 'Bas1', 'Site '    ,4, 10, 0, 20, 12, TAlphaColorRec.Red );
//        ObjectOlustur( LItem, LLabel[2], 'Bas2', 'TL'   ,4, 150, 0, 20, 12, TAlphaColorRec.Red );
//          ObjectOlustur( LItem, LLabel[3], 'Bas3', '%' ,1, 170, 0, 20, 12, TAlphaColorRec.Red );

     // Veri Alanları
     // -----------------------------------------------------------------------------
       ObjectOlustur( AItem, LData[1], 'Data1' , ad                         ,4 ,  30, 0, 20, 12, TAlphaColorRec.Black, True );
       ObjectOlustur( AItem, LData[2], 'Data2' , floattostr(fiyat) + ' TL'  ,0 , 210, 0, 20, 15, TAlphaColorRec.Black, True );
       ObjectOlustur( AItem, LData[3], 'Data3' , '% ' + inttostr(yuzdelik)  ,0 , 230, 0, 20, 15, TAlphaColorRec.Red, True );
       ObjectOlustur( AItem, LData[4], 'Data4' , link                       ,0 ,   0, 0,  0,  0, TAlphaColorRec.Black, False );
       ObjectOlustur( AItem, LData[5], 'Data5' , siteisim                   ,4 ,  10, 0, 20, 15, TAlphaColorRec.Red, True );
       Resimolustur ( AItem, LImage);
    end;
end;
@Jakarta2

Lütfen yazdığınız mesajlarınızı silmeyiniz.
Daha önceki mesajlarınızda da yapmışsınız. Yazılan cevaplar öksüz kalıyor. Anlamını yitiriyor.

* Her defasında önceki mesajınızdan alıntı ile cevap yazmak buna çözüm olacak ancak başlık kirliliği oluşturduğundan tercih etmesem de bu yola bizi teşvik etmezseniz herkes adına konuşmayayım ama kendi adıma memnun olurum.

* Buradaki çözümde ise "procedure yapmak" ile önceki kullandığınız hali arasında bir fark kesinlikle yoktur.
* Aslında resim verisi mevcut olan "LImage" yerine içi belki de boş olan "resimdata" isimli başka bir değişkeni göstermiş olmaktan ibaret olduğu anlaşılıyor. Bu gibi hatalar sizi küçültmez bunun için başlık silmeye değmez.

Çalışmalarınızda başarılar.
Sayfalar: 1 2