Tüm Platformlar için Hızlı Uygulama Geliştirme Kitabı... Delphi
Ön Sipariş Talebinde Bulunan Üyelerimiz
Sipariş Talebinde Bulunan Üyelerimiz
Hoşgeldin, Ziyaretçi
Sitemizden yararlanabilmek için Kayıt olmalısınız.

Kullanıcı Adınız:
  

Şifreniz:
  





Forumda Ara

(Gelişmiş Arama)

Forum İstatistikleri
» Toplam Üyeler: 1.409
» Son Üye: sharamrit
» Toplam Konular: 2.687
» Toplam Yorumlar: 21.812

Detaylı İstatistikler

Son Aktiviteler
Tutar kısmındaki soru işa...
Forum: Genel Programlama
Son Yorum:

edo
2 saat önce
» Yorumlar: 9
» Okunma: 212
Delphi 10.3 Rio
Forum: Delphi 10.3 Rio
Son Yorum:

pro_imaj
3 saat önce
» Yorumlar: 66
» Okunma: 2.478
Yeni Kaynak Kitabın Yayın...
Forum: Kitap Hakkında
Son Yorum:

yhackup
4 saat önce
» Yorumlar: 29
» Okunma: 1.196
Delphi ile Android Uygula...
Forum: Mobil Platform - FireMonkey (FMX)
Son Yorum:

Fesih ARSLAN
4 saat önce
» Yorumlar: 4
» Okunma: 78
chart bileseni
Forum: Mobil Platform - FireMonkey (FMX)
Son Yorum:

klavye
5 saat önce
» Yorumlar: 2
» Okunma: 73
[+10 Puan] String Manipül...
Forum: Access violation
Son Yorum:

Tuğrul HELVACI
6 saat önce
» Yorumlar: 16
» Okunma: 427
TNetHttpClient post json
Forum: Genel Programlama
Son Yorum:

ahmet_sinav
6 saat önce
» Yorumlar: 6
» Okunma: 124
Dosya Bulma (Algoritmik S...
Forum: Access violation
Son Yorum:

engerex
6 saat önce
» Yorumlar: 28
» Okunma: 427
[Çözümlü] Google Play'de ...
Forum: Mobil Platform - FireMonkey (FMX)
Son Yorum:

nguzeller
8 saat önce
» Yorumlar: 7
» Okunma: 157
Çevirimiçi Diyagram Çizim...
Forum: Program Tanıtımı
Son Yorum:

frmman
Dün, Saat: 19:44
» Yorumlar: 6
» Okunma: 93

 
  SQL Server veritabanına nasıl bağlanmalıyız? Unidac mı, Firedac mı, DataSnap mi?
Yazar: csunguray - 07-11-2018, Saat: 11:06 - Forum: Mobil Platform - FireMonkey (FMX) - Yorumlar (1)

Daha önce bazı Android uygulamalarım oldu. Bunlarda Emb'nin tavsiye ettiği üzere FireDAC + DataSnap iklisi ile bağlandım. Bazı sorunlarım olsa de işimi gördü. UniDAC bileşenlerinin doğrudan SQL Server'a bağlanma yeteneği var. Bunu kullanan arakadaş var mı? Bir sorun yaşamış mı? Internetten bağlanıldığında performans tatmin edici mi?

Bu konuyu yazdır

  Mağaza dışı uygulama yayinladiginizda yuklenme sayısını nasıl takip ediyorsunuz?
Yazar: 10.Köy - 06-11-2018, Saat: 17:53 - Forum: Merakımdan Soruyorum - Yorumlar (3)

Merhaba.  Mağaza dışı uygulama yayinladigimda webbrowser ile google url ziyaret ettirip hesabimdan takip ediyordum.  Ancak google url biliyorsunuz Mart 2019 tarihinde hizmeti sonlandiriyor. Alternatif olarak google analytic ile yapmak kalıyor ilk aklıma gelen.  Sizin tercih ettiğiniz farklı yöntemler nelerdir?

Bu konuyu yazdır

  Linq Kullanım
Yazar: sebahattin.koc - 06-11-2018, Saat: 17:26 - Forum: Genel Programlama - Yorumlar (5)

Üçüncü nesil eklentiler kullanmadan Delphi'de Linq kullanabiliyormuyuz ?

Bu konuyu yazdır

  Excele Resimli Aktarma
Yazar: gonulali - 06-11-2018, Saat: 16:19 - Forum: Genel Programlama - Yorumlar (11)

Merhaba Arkadaşlar,

Programımdaki kayıtları excele aktarabiliyorum. CxGridle veya Dbgriddeki bilgileri.
Excele aktarırken her kayıtta bulunan resimleri de ben excele aktarmak istiyorum. Yani her kayıtın yanında resmide çıksın istiyorum. Bunu nasıl yapabilirim acaba?

Bu konuyu yazdır

  Uygulama Durdurulması ve Veri Listeleme
Yazar: megaTRon - 06-11-2018, Saat: 10:25 - Forum: Mobil Platform - FireMonkey (FMX) - Yorum Yok

Merhabalar,

admob'dan aldığım videolu reklam bittikten sonra kullanıcı kapatırken uygulama durduruldu hatası veriyor ve uygulama kapanıyor, sebebi ne olabilir?

birde instagram anasayfası mantığında makale listesi yaptım ora da aşırı derecede yavaşlık söz konusu, ms sql'den verileri api ile getiriyorum.

Bu konuyu yazdır

  Butonları GroupBox İçine Dağıtma
Yazar: akissoftware - 06-11-2018, Saat: 10:06 - Forum: Genel Programlama - Yorumlar (4)

Arkadaşlar merhaba. Elimden geldiği kadar birilerine yardımcı olmaya ve bazı konularda da yardım almaya çalışıyorum. Bir problemim var. Bir türlü çözemediğim için bu konuda bilgili arkadaşlara sormak istedim. 

Bir form üzerine 1 tane SuiGroupbox ekledim. Ve içerisine runtime olarak butonlar oluşturuyorum. Buraya kadar sorun yok. Yapamadığım şey ise bu butonları en ve boy olarak bu Groupbox içerisine eşit olarak dağıtmak. Bu konuda yardımcı olabilir misiniz?

Kodlarım aşağıda mevcuttur.

procedure TForm1.CustomButtonClick(Sender: TObject);
var
SelectedItem:String;
i,m:integer;
NewButtonU: TButton;
//veri: TVeri;
begin
// ***********************************************
while  suiGroupBoxUrun.ControlCount > 0 do
suiGroupBoxUrun.Controls[0].Free;
// ***********************************************
SelectedItem:= TButton(Sender).caption;
with Form1.MyQueryAltUrunler do
begin
Close;
SQL.Clear;
SQL.Text := 'SELECT * FROM TABLE_PRODUCTS INNER JOIN TABLE_CATEGORY on TABLE_PRODUCTS.CatID = TABLE_CATEGORY.ID WHERE `Catname` = "' + SelectedItem + '" ';
Open;
i:=0;
while NOT(MyQueryAltUrunler.EOF) do begin
NewButtonU := TButton.create(self);
with NewButtonU do
begin

Height := ( suiGroupBoxUrun.Height - (MyQueryAltUrunler.RecordCount * 10)) div MyQueryAltUrunler.RecordCount ;
Width  := suiGroupBoxUrun.Width - 20;
Left   :=  (Width - Width )+ 10 ;
Top := (Top - Top) + 15 + (i * ((suiGroupBoxUrun.Height - (MyQueryAltUrunler.RecordCount * 5)) div MyQueryAltUrunler.RecordCount) );

Parent := suiGroupBoxUrun;
OnClick := CustomUButtonClick;
Caption := MyQueryAltUrunlerProdName.AsString;

NewButtonU.FVeri.SUrunFiyati := MyQueryAltUrunlerPrice.AsFloat;
NewButtonU.FVeri.SUrunName := MyQueryAltUrunlerProdName.AsString;
Tag := Integer(FVeri.SUrunId);
end;
Inc(i);
MyQueryAltUrunler.Next;
end;
Close;
end;
end;

Bu konuyu yazdır

Question UniDBHTMLMemo Blob Field
Yazar: masteryoda - 06-11-2018, Saat: 09:09 - Forum: Delphi ile Web Teknolojileri - Yorumlar (3)

UniDBHTMLMemo kullanıyorum bağlı olduğu alan firebirde blob bir alan ben buraya html olarak açıklama girip kaydedilsin istiyorum ama kaydetikten sonra
UniDBHTMLMemo içeriğinde (MEMO)  görünüyor veritabanından sorguladığımda daha önce girdiğim değeri silip içerisine (MEMO) yazdığını görüyorum
bu sorunu nasıl aşabilirim?

Bu konuyu yazdır

Photo Generics (soysallar) ve TCustomAttribute kullanımı ve RTTI
Yazar: mustafaozpinar - 06-11-2018, Saat: 02:25 - Forum: Makale - Yorumlar (13)

Generic kullanımı normalde fazla gerekmez, ta ki RTTI kullanıncaya kadar. Ve RTTI kullanımı da sizi modern tasarımlara Design Pattern'lere götürecektir, Design Pattern kullanmaya başladıktan sonra ise tüm tasarımlarınız generic içermeye başlayacaktır. Yani aslında şunu söyleyebilirim, eğer Design Pattern kullanmaya niyetiniz yoksa bu sayfayı okumanıza da hiç gerek yok bence. Direkt olarak atlamanızı tavsiye ederim.

Benim Delphi yazılımcılarında tanık olduğum en ciddi sorun, moderniteye sırtlarını dönmüş olmaları. Çoğunlukla Delphi 7 onlara yetiyor, web yazılımı yapacakları zaman DotNet ya da PHP ile işlerini halletmeye çalışıyorlar, bitiyor gidiyor. İşin enteresanı, bu dillere geçtikleri zaman modern yazılımı, Design Pattern'leri öğrenmeye çalışıyorlar. Bunları Delphi'de uygulamak akıllarına gelmiyor. Varsa yoksa komponentler, hem de VCL. Neyse bu ayrı bir yazı konusu.

Bu yazıda bir class yapısında generic nasıl kullanılır, onu anlatacağım.

Generic'i tanımlarsak : Bir Class'a, bir procedure ya da function'a <T : Base type> şeklinde verdiğimiz bir tip bildirimidir. Bu tip bildirimini daha sonra Class'ın (ya da neye verdiysek onun) içinde kullanabiliriz. Buradaki T tipinin geçtiği her yere bu tip kopyalanır. Burada istersek Base type da kullanabiliriz. Bunun anlamı, verdiğimiz tip bildirimi bu base type ya da bundan türemiş bir type olması gerektiğidir. Bu sistemin en güzel yanı, aralarında bir uyumsuzluk olduğunda hemen derleme hatası vermesidir. Görüldüğü gibi bize ciddi bir type safety (tip güvenliği) sağlamaktadır.

Öncelikle bir DB tablosunun entity'sini oluşturacağız, bunun için MySQL üzerinde gelen örnek veritabanı olan SAKILA'yı kullanacağım.

  TActor = class(TBaseModel)
  private
    Factor_id: Integer;
    Ffirst_name: string;
    Flast_name: string;
    Flast_update: TDateTime;
    Fis_active: Boolean;
  published
    property ActorId: Integer read Factor_id write Factor_id;
    property FirstName: string read Ffirst_name write Ffirst_name;
    property LastName: string read Flast_name write Flast_name;
    property IsActive: Boolean read Fis_active write Fis_active;
    property LastUpdate: TDateTime read Flast_update write Flast_update;
  end;

Bu tabloya fazladan IsActive kolonunu, tablo yaratmak için Sql komutunu oluştururken  bazı  kısımlara da girmesi için ekledim.

Sql komutunu yazdıracağımız entity bu, ancak bu sınıfı sql komutuna çevirebilmek için bu bilgilerden fazlasına ihtiyacımız var. Tablonun adı, tablo kolonlarının adı, uzunluğu, ondalık kısım gibi bilgileri de bilmemiz gerekiyor. İşte bu noktada imdadımıza TCustomAttribute yetişiyor.
Custom attribute'ler bir class, class'ın bir değişkeni (field), bir property'si veya metodu için tanımlanabilirler. Custom attribute, bu class'ın şu özelliği de var demek anlamına gelir. Daha sonra bu özellikleri alarak onlar üzerinde işlemler yapabiliriz.  Kullanımı şu şekildedir;

  [Entity('actor')]                // EntityAttribute
  TActor = class(TBaseModel)
    ...
    [Column('first_name', [], 45)]

    property FirstName: string read Ffirst_name write Ffirst_name;
    ...
  end;

CustomAttribute için ayrı bir unit oluşturup içine Attribute tanımlarımızı yapıyoruz. EntityAttribute tablonun ismini Entity class'ına iliştirmek ve daha sonra almak için kullanılır. ColumnAttribute ise her bir kolonun özelliklerini o kolonlara iliştirmek için kullanılır.


  EntityAttribute = class(TCustomAttribute)
 private
   FTableName : string;
   FSchemaName : string;
   function GetFullName : string;
 public
   constructor Create(const ATableName: string; const ASchemaName: string = '');
   property TableName: string read FTableName;
   property Schema: string read FSchemaName;
   property FullName: string read GetFullName;
 end;

 TColProp = (
   cpPrimaryKey,
   cpRequired,
   cpUnique,
   cpNotNull,
   cpAutoGenerated
 );
 TColProps = set of TColProp;
 ColumnAttribute = class(TCustomAttribute)
 private
   FColumnName : string;
   FLength: Integer;
   FPrecision: Integer;
   FScale: Integer;
   FColProps : TColProps;
   function GetIsPrimaryKey : Boolean;
   function GetIsAutoGenerated : Boolean;
 public
   constructor Create(const AColumnName : string) overload;
   constructor Create(const AColumnName : string; AColProps : TColProps;
                      ALength : Integer=0;
                      APrecision : Integer=0;
                      AScale : Integer=0); overload;
   property ColumnName: string read FColumnName write FColumnName;
   property Length: Integer read FLength write FLength;
   property Precision: Integer read FPrecision write FPrecision;
   property Scale: Integer read FScale write FScale;
   property ColProps: TColProps read FColProps write FColProps;
   property IsPrimaryKey: Boolean read GetIsPrimaryKey;
   property IsAutoGenerated: Boolean read GetIsAutoGenerated;
 end;

Ve bunların metodlarını yazıyoruz (sadece atamalar var).

Bunun arkasından Entity'lerimizi Attribute'lerle donatıyoruz.

 [Entity('actor')]                //] EntityAttribute
 TActor = class(TBaseModel)
 private
   Factor_id: Integer;
   Ffirst_name: string;
   Flast_name: string;
   Flast_update: TDateTime;
   Fis_active: Boolean;
 published
   [Column('actor_id', [cpPrimaryKey, cpRequired, cpUnique, cpNotNull])]
   property ActorId: Integer read Factor_id write Factor_id;
   [Column('first_name', [], 45)]
   property FirstName: string read Ffirst_name write Ffirst_name;
   [Column('last_name', [], 45)]
   property LastName: string read Flast_name write Flast_name;
   [Column('is_active')]
   property IsActive: Boolean read Fis_active write Fis_active;
   [Column('last_update')]
   property LastUpdate: TDateTime read Flast_update write Flast_update;
 end;

Bu biraz ORM tanımlamalarına benziyor değil mi? Zaten amacımız bu Entity'yi kullanarak Table Create SQL cümleciği oluşturmak.

Şimdi sıra bu Sql'i oluşturacak sınıfı yazmaya geldi.

  TSqlCreateBuilder<T : TBaseModel> = class
  private
    function GetColumnDefinition(const AColName: string; AColProps: TColProps;
      AColType: TTypeKind; ALen, APrec, AScl: Integer; ATypeInfo : Pointer;
      AAutoGen : boolean): string;
    function BuildSQLDataType(AColType : TTypeKind; ALen, APrec, AScl : integer; ATypeInfo : Pointer) : string;
  public
    function Execute : string;
  end;
Burada gördüğümüz gibi T yi tip belirteci olarak gösterdik. Daha sonra yazdığımız TBaseModel sözcüğü T için göndereceğimiz tipin en azından TBaseModel olması ya da ondan türetilmiş bir sınıf olması gerektiğini belirtir. Bu yanlış class geçmeyi engellemek için iyi bir yöntemdir. Programdan daha sonra geçtiğimiz entity tipi bu class içinde doğrudan o tanımlıymış gibi işlem görecektir.

Yazacağımız yordamda ilk önce EntityAttribute'den tablo adını elde ediyoruz. 
1-RttiContext yarat,
 
 FRttiContext := TRttiContext.Create;
2-Bundan GetType ile RttiType bilgisini al,
   
 LRttiType := FRttiContext.GetType(TypeInfo(T));

3-Bu entity'ye iliştirilmiş tüm Attribute'leri tarayıp EntityAttribute'yi bulmak için bir for döngüsü oluştur ve EntityAttribute'yi bulunda tableName'i al, döngüden çık.


    tblName := '';
    for attr in LRttiType.GetAttributes do
      if attr is EntityAttribute then
      begin
        tblName := (attr as EntityAttribute).FullName;
        Break;
      end;

4-Tablonun kolon bilgilerini almak için Entity'nin property'leri üzerinde bir döngü oluşturuyoruz.

    for prop in LRttiType.GetProperties do
      if prop.Visibility=mvPublished  then    //!!!
      begin
        aautogen := False;
        for attr in prop.GetAttributes do
          if ((attr as ColumnAttribute).IsAutoGenerated) then
          begin
            aautogen := True;
            Break;
          end;

        fldName := prop.Name;
        alength := 0;
        aprecision := 0;
        ascale := 0;
        colProps := [];

        for attr in prop.GetAttributes do
          if (attr is ColumnAttribute) then
          begin
            fldName := (attr as ColumnAttribute).ColumnName;
            alength := (attr as ColumnAttribute).Length;
            aprecision := (attr as ColumnAttribute).Precision;
            ascale := (attr as ColumnAttribute).Scale;
            colProps := (attr as ColumnAttribute).ColProps;
            Break;
          end;

        s := GetColumnDefinition(fldName, colProps, prop.PropertyType.TypeKind, alength, aprecision, ascale, prop.PropertyType.Handle, aautogen);
        if Result='' then
          Result := Result + s + #13#10
        else
          Result := Result + ','+s + #13#10;
      end;

Görüldüğü gibi 2.satırda sadece Published yapılmış property'leri almış oluyoruz. 
Tüm kolon özelliklerini alıyoruz ve GetColumnDefinition adlı metoda gönderip gelen sonucu Sql komutuna ekliyoruz.

5-GetColumnDefinition'ı yazıyoruz;


function TSqlCreateBuilder<T>.GetColumnDefinition(const AColName: string;
  AColProps: TColProps; AColType: TTypeKind; ALen, APrec, AScl: Integer;
  ATypeInfo: Pointer; AAutoGen: boolean): string;
begin
  Result := Format('%0:s %1:s %2:s %3:s', [
    AColName,
    BuildSQLDataType(AColType, ALen, APrec, AScl, ATypeInfo),
    IfThen(cpNotNull in AColProps, 'NOT NULL', 'NULL'),
    IfThen(cpPrimaryKey in AColProps, IfThen(AAutoGen, 'IDENTITY(1,1) ')+'PRIMARY KEY')]);
end;
6-Burada adı geçen BuildSQLDataType adlı metodu yazıyoruz. 

function TSqlCreateBuilder<T>.BuildSQLDataType(AColType: TTypeKind; ALen, APrec,
 AScl: integer; ATypeInfo: Pointer): string;
begin
 Result := 'INTEGER';
 case AColType of
   tkUnknown: ;
   tkInteger, tkSet:
     if APrec > 0 then
       Result := Format('NUMERIC(%0:d, %1:d)', [APrec, AScl]);
   tkEnumeration:
     if ATypeInfo = System.TypeInfo(Boolean) then
       Result := 'BIT';
   tkInt64:
     if APrec > 0 then
       Result := Format('NUMERIC(%0:d, %1:d)', [APrec, AScl])
     else
       Result := 'BIGINT';
   tkChar: Result := Format('CHAR(%d)', [ALen]);
   tkFloat:
     if ATypeInfo = System.TypeInfo(TDate) then
       Result := 'DATE'
     else
     if ATypeInfo = System.TypeInfo(TDateTime) then
      Result := 'DATETIME'
      //Result := 'TIMESTAMP'
     else
     if ATypeInfo = System.TypeInfo(TTime) then
       Result := 'TIME'
     else
       if APrec > 0 then
         Result := Format('NUMERIC(%0:d, %1:d)', [APrec, AScl])
       else
         Result := 'FLOAT';
   tkString, tkLString: Result := Format('VARCHAR(%d)', [ALen]);
   tkClass, tkArray, tkDynArray, tkVariant: Result := 'BLOB';
   tkMethod: ;
   tkWChar: Result := Format('NCHAR(%d)', [ALen]);
   tkWString, tkUString: Result := Format('NVARCHAR(%d)', [ALen]);
   tkRecord: ;
   tkInterface: ;
   tkClassRef: ;
   tkPointer: ;
   tkProcedure: ;
 end;
end;
Görüldüğü gibi burada verilen Entity class'ından kolon tipini bulup onun karşılığını oluşturuyoruz (buradaki tanımlamalar MSSQL içindir).
Programı çalıştırıp Build SQL tuşuna basıldığı zaman;
Ekran görüntüsü
2018-11-06.png

Blog sayfam : Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Bu makalenin oluşturulmasında Linkleri Görebilmeniz İçin Giriş yap veya Üye Olkısmen yararlandım.

Bu konuyu yazdır

  ekran görüntüsü alma sorunu ?
Yazar: Mr.Developer - 05-11-2018, Saat: 20:01 - Forum: Mobil Platform - FireMonkey (FMX) - Yorumlar (7)

iyi akşamlar ,

layout bileşenini kullanarak ekran görüntüsü alıyorum fakat resim siyah oluyor bunu nasıl çözebilirim ?

daha önce bu konuda bir konu daha açılmıştı sanırım fakat onu bulamadım birdaha.

Image1.Bitmap := Layout1.MakeScreenshot;

Bu konuyu yazdır

  Ücretsiz Kitap ve Ücretsiz Delphi Lisansları
Yazar: Fesih ARSLAN - 05-11-2018, Saat: 17:12 - Forum: Kitap Hakkında - Yorumlar (6)

Merhaba,
Üniversitelerin herhangi bir fakülte/bölüm/okulunda Delphi, Object Pascal veya Pascal dersinin verilmesi şartıyla (resmi müfredatında yer alması kaydıyla), Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol tarafından Delphi akademik lisansı, hocaya bir adet yeni Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol ve dersi alan her öğrenciye tahsisli (named lisans) ücretsiz kaynak kitabımızın dijital sürümü verilecek.
Bu kapsamda bir çalışma içerisindeyiz; belirttiğim şartlarda bildiğiniz fakülte/bölüm/okul varsa ve ders hocalarının iletişim bilgisini ÖM ile bana bildirirseniz sevinirim.

Bu konuyu yazdır