Kod kısaltma hakkında yardım / cxGrid OnCustomDrawCell

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
cengaver
Üye
Mesajlar: 111
Kayıt: 01 Nis 2014 05:02
Konum: İstanbul

Kod kısaltma hakkında yardım / cxGrid OnCustomDrawCell

Mesaj gönderen cengaver »

Merhaba,

Bir kod bloğum var ve bu kod bloğu eğer bu şekilde devam ederse ileride altından kalkılamayacak kadar devasa bir hale gelecek, yolun başındayken kodu kısaltmaya çalışıyorum ama kodun bir bölgesinde resmen basiretim bağlandı, variant veri tipiyle de ayrıca uğraşmak gerekiyor... Bi fikri olan, yol gösterecek biri var mı?

Aşağıda kodun bir kısmı yer alıyor ve sürekli tekrar eden kısım da aslında burası. Ben bu kodu tıpkı excel'deki koşullu biçimlendirme fonksiyonunu yerine getirmesi amacıyla kullanıyorum;

Kod: Tümünü seç

              if (aAlan2 = '') then begin
                  if (VarIsEmpty(aString) = false) then begin
                      if (ZamanVar = TRUE)
                      then Bicimlendir := eger(aZaman1 < StrToDateTime(aDeger))
                      else Bicimlendir := eger(aString < aDeger);
                  end;
              end else begin
                  if (VarIsEmpty(aString) = FALSE) and (VarIsEmpty(aString2) = FALSE) then begin
                     if (ZamanVar = TRUE)
                     then Bicimlendir := eger(aZaman1 < aZaman2)
                     else Bicimlendir := eger(aString < aString2);
                  end;
              end;
kodun tamamı ise aşağıdaki gibidir; cxGrid'in OnCustomDrawCell olayında kullanılır;

Kod: Tümünü seç

...
Type
  TBicimlendirme = record
    Alan        ,
    Alan2       : String;     // Ref
    Kriter      : String;     // < = >
    Deger       ,             // falan
    Deger2      : Variant;    // filan
    ZeminRengi  ,
    MetinRengi  : TColor;     // TColor için integer...
    Kalin       ,
    Yatik       ,
    AltiCizik   ,
    UstuCizik   : Boolean;    // font için boolean
  end;

...
var
  KosulluBicimlendirmeler: Array of TBicimlendirme;

...
...

procedure TListe.KosulluBicimlendirme(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
var
  aAlan       ,
  aAlan2      ,
  aKriter     : String;
  aDeger      ,
  aDeger2     ,
  aString     ,
  aString2    : Variant;
  aZaman1     ,
  aZaman2     : TDateTime;
  aTip        : TFieldType;
  I           : Integer;
  Bicimlendir : Boolean;
  Bicim       : TBicimlendirme;
  aIndex      : Integer;
  aIndex2     : Integer;
  ZamanVar    : Boolean;
  procedure memola(aText: String); begin if Trim(aText) > '' then Memo.Lines.Add(aText); end;
  function eger(aKarsilastirma: Boolean): Boolean;
  begin {Eğer sonuç doğruysa true değilse false sonucunu veriyor PHP'deki iif gibi bişey...}
    if aKarsilastirma = TRUE then Result := TRUE else Result := FALSE;
  end;
begin
  aAlan := Trim(TcxGridDBColumn(AViewInfo.Item).DataBinding.FieldName); // o an gözüken alan
  for I := low(KosulluBicimlendirmeler) to high(KosulluBicimlendirmeler) do begin
      Bicim := KosulluBicimlendirmeler[I];
      if (Bicim.Alan = aAlan) then begin
          aAlan2  := Bicim.Alan2;
          aKriter := Bicim.Kriter;
          aDeger  := Bicim.Deger;
          aDeger2 := Bicim.Deger2;

          aTip    := TcxGridDBColumn(AViewInfo.Item).DataBinding.Field.DataType;
          if aTip in [ftDate, ftDateTime] then ZamanVar := TRUE else ZamanVar := FALSE;

          aIndex  := aViewInfo.Item.Index;
          if (AViewInfo.GridRecord.DisplayTexts[aIndex] > '') then begin
              aString := AViewInfo.GridRecord.Values[aIndex];
              if (ZamanVar = TRUE) then if VarIsEmpty(aString) = FALSE then aZaman1 := VarToDatetime(aString);
          end;

          //aIndex2 := -1; // Başlangıç değeridir.
          if (aAlan2 > '') then begin
              aIndex2 := TcxGridDBTableView(Sender).GetColumnByFieldName(aAlan2).Index;
              aString2:= AViewInfo.GridRecord.Values[aIndex2];
              if (VarIsDate(aString2) = TRUE) then begin
                  aZaman2 := VarToDatetime(aString2);
              end;
          end;

          Bicimlendir := FALSE; // Başlangıç değeridir.
          if (aKriter = '=') then begin
              if (aAlan2 = '') then begin
                  if (VarIsEmpty(aString) = false) then begin
                      if (ZamanVar = TRUE)
                      then Bicimlendir := eger(aZaman1 = StrToDateTime(aDeger))
                      else Bicimlendir := eger(aString = aDeger);
                  end;
              end else begin
                  if (VarIsEmpty(aString) = FALSE) and (VarIsEmpty(aString2) = FALSE) then begin
                     if (ZamanVar = TRUE)
                     then Bicimlendir := eger(aZaman1 = aZaman2)
                     else Bicimlendir := eger(aString = aString2);
                  end;
              end;
          end else
          if (aKriter = '<') then begin
              if (aAlan2 = '') then begin
                  if (VarIsEmpty(aString) = false) then begin
                      if (ZamanVar = TRUE)
                      then Bicimlendir := eger(aZaman1 < StrToDateTime(aDeger))
                      else Bicimlendir := eger(aString < aDeger);
                  end;
              end else begin
                  if (VarIsEmpty(aString) = FALSE) and (VarIsEmpty(aString2) = FALSE) then begin
                     if (ZamanVar = TRUE)
                     then Bicimlendir := eger(aZaman1 < aZaman2)
                     else Bicimlendir := eger(aString < aString2);
                  end;
              end;
          end else
          if (aKriter = '>') then begin
              if (aAlan2 = '') then begin
                  if (VarIsEmpty(aString) = false) then begin
                      if (ZamanVar = TRUE)
                      then Bicimlendir := eger(aZaman1 > StrToDateTime(aDeger))
                      else Bicimlendir := eger(aString > aDeger);
                  end;
              end else begin
                  if (VarIsEmpty(aString) = FALSE) and (VarIsEmpty(aString2) = FALSE) then begin
                     if (ZamanVar = TRUE)
                     then Bicimlendir := eger(aZaman1 > aZaman2)
                     else Bicimlendir := eger(aString > aString2);
                  end;
              end;
          end else
          if (aKriter = '<>') then begin
              if (aAlan2 = '') then begin
                  if (VarIsEmpty(aString) = false) then begin
                      if (ZamanVar = TRUE)
                      then Bicimlendir := eger(aZaman1 <> StrToDateTime(aDeger))
                      else Bicimlendir := eger(aString <> aDeger);
                  end;
              end else begin
                  if (VarIsEmpty(aString) = FALSE) and (VarIsEmpty(aString2) = FALSE) then begin
                     if (ZamanVar = TRUE)
                     then Bicimlendir := eger(aZaman1 <> aZaman2)
                     else Bicimlendir := eger(aString <> aString2);
                  end;
              end;
          end else
          if (aKriter = '>=') then begin
              if (aAlan2 = '') then begin
                  if (VarIsEmpty(aString) = false) then begin
                      if (ZamanVar = TRUE)
                      then Bicimlendir := eger(aZaman1 >= StrToDateTime(aDeger))
                      else Bicimlendir := eger(aString >= aDeger);
                  end;
              end else begin
                  if (VarIsEmpty(aString) = FALSE) and (VarIsEmpty(aString2) = FALSE) then begin
                     if (ZamanVar = TRUE)
                     then Bicimlendir := eger(aZaman1 >= aZaman2)
                     else Bicimlendir := eger(aString >= aString2);
                  end;
              end;
          end else
          if (aKriter = '<=') then begin
              if (aAlan2 = '') then begin
                  if (VarIsEmpty(aString) = false) then begin
                      if (ZamanVar = TRUE)
                      then Bicimlendir := eger(aZaman1 <= StrToDateTime(aDeger))
                      else Bicimlendir := eger(aString <= aDeger);
                  end;
              end else begin
                  if (VarIsEmpty(aString) = FALSE) and (VarIsEmpty(aString2) = FALSE) then begin
                     if (ZamanVar = TRUE)
                     then Bicimlendir := eger(aZaman1 <= aZaman2)
                     else Bicimlendir := eger(aString <= aString2);
                  end;
              end;
          end else
          if (aKriter = 'içinde') then begin
              if (aAlan2 = '')
              then Bicimlendir := eger(AnsiPos(lowercase(VarToStr(aDeger)), lowercase(VarToStr(aString))) > 0)
              else Bicimlendir := eger(AnsiPos(lowercase(VarToStr(aString2)), lowercase(VarToStr(aString))) > 0);

              if (aAlan2 = '') then begin
                  if (VarIsEmpty(aString) = false) then begin
                      if (ZamanVar = TRUE)
                      then Bicimlendir := eger(aZaman1 < StrToDateTime(aDeger))
                      else Bicimlendir := eger(aString < aDeger);
                  end;
              end else begin
                  if (VarIsEmpty(aString) = FALSE) and (VarIsEmpty(aString2) = FALSE) then begin
                     if (ZamanVar = TRUE)
                     then Bicimlendir := eger(aZaman1 < aZaman2)
                     else Bicimlendir := eger(aString < aString2);
                  end;
              end;

          end else
          if (aKriter = 'gün farkı') then begin
              if (aAlan2 = '') then begin
                  try if DaySpan( VarToDateTime(aString), NOW) > StrToInt(aDeger) then Bicimlendir := TRUE;
                  except end;
              end else begin
                  try if DaySpan(VarToDateTime(aString), VarToDateTime(aString2)) > aDeger then Bicimlendir := TRUE;
                  except end;
              end;
          end else
          if (aKriter = 'arasında') then begin
          end else
          if (aKriter = 'sayısal fark') then begin
          {
              if (aAlan2 = '') then begin
                  try
                    if abs(Integer(aString)) > abs(StrToInt(aDeger)) then Bicimlendir := TRUE;
                  except
                    Bicimlendir := FALSE;
                  end;
              end else begin
                  try
                    if abs(Integer(aString)) > abs(Integer(aString2)) then Bicimlendir := TRUE;
                  except
                    Bicimlendir := FALSE;
                  end;
              end;
          }
          end;
          {Bu noktadan sonra biçimlendirme devreye giriyor...}
          if (Bicimlendir = TRUE) then begin
              if ( Bicim.ZeminRengi <> TColor(0) ) then aCanvas.Brush.Color := TColor( Bicim.ZeminRengi );
              if ( Bicim.MetinRengi <> TColor(0) ) then aCanvas.Font.Color  := TColor( Bicim.MetinRengi );
              if ( Bicim.Kalin     = TRUE ) then aCanvas.Font.Style := aCanvas.Font.Style + [fsBold]      else aCanvas.Font.Style := aCanvas.Font.Style - [fsBold];
              if ( Bicim.Yatik     = TRUE ) then aCanvas.Font.Style := aCanvas.Font.Style + [fsItalic]    else aCanvas.Font.Style := aCanvas.Font.Style - [fsItalic];
              if ( Bicim.AltiCizik = TRUE ) then aCanvas.Font.Style := aCanvas.Font.Style + [fsUnderline] else aCanvas.Font.Style := aCanvas.Font.Style - [fsUnderline];
              if ( Bicim.UstuCizik = TRUE ) then aCanvas.Font.Style := aCanvas.Font.Style + [fsStrikeOut] else aCanvas.Font.Style := aCanvas.Font.Style - [fsStrikeOut];
          end;
      end;
  end;
end;
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2381
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Kod kısaltma hakkında yardım / cxGrid OnCustomDrawCell

Mesaj gönderen freeman35 »

if aKarsilastirma = TRUE then Result := TRUE else Result := FALSE; yerine
"Result := Not aKarsilastirma;
Boolean değerleri eşiklikle karşılaştırmana gerek yok, çok çok uzun zamandan beri.
if aKarsilastirma then ..... yada if not aKarsilastirma then begin..... şeklinde kullan
if Trim(aText) > '' then Türkçesi-> Atext büyükse boşluktan??? mantıklısı if Trim(aText) <> '' then AText farklıysa boşluktan, yada Atext boş değilse
tek field için boyama yapacaksan, gridin genel drawcell i yerine column un drawcell ini kullan.
Ben genelde öncelikle olumsuz koşulları kotrol ettirip, işlem yapılmayacaksa Exit; le çıkartırım, gereksiz yere if blokları kalabalık yapmaz.
db kullanmışsın, ondraw lar çok sık tetiklenir, bukadar uzun kod yerine bağlı olan dataset e calculated field eklerim, o sadece gerektiğinde tetiklenir, yani dataset değiştiğinde.
Tarih bilgisini string olarak tutmak bana hep saçma gelmiştir. stringi tarihe çevir işlem yap tekrar string e çevir, yüklü pc nin sistem formatı farklıysa alsana başka problem, TDate yada TDateTime saklayıp, gösterileceğinde formatlatıp stringe çevirmek daha kolay ve mantıklı, hele bu field dan direk gride basılacaksa field ın display formatına istenen formatı yazmak çokdaha uygun, field.displaytext bu değeri döndürür.
KosulluBicimlendirmeler bu array dynamik, boyutlandırması yani genişletmesi, ve daraltması gerek, yoksa büyük bir memory leak ve olmadık yerde listindex outoff bounds hatası alırsın. ayrıca o record memory ye nasıl yerleşiyor? yada yerleşiyormu? Font için değerler saklamışsın bir sürü okadar önemli ise onların yerine TFont sakla, Metin rengi dahil tüm font özelliklerini saklamış olursun.
kullanımını şöyle yapmalısın
MyFont := TFont.Create;
MyFont.Assign(falancaComp.Font);
MyFont.Style := [fsBold,fsItalic];

Aklıma gelen öneriler bunlar
Kolay gele
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 !!!
Kullanıcı avatarı
cengaver
Üye
Mesajlar: 111
Kayıt: 01 Nis 2014 05:02
Konum: İstanbul

Re: Kod kısaltma hakkında yardım / cxGrid OnCustomDrawCell

Mesaj gönderen cengaver »

Teşekkürler Freeman35,

Bahsettiklerinin ben de farkındayım. Optimizasyonu ve standardizasyonu çalışan kodu elde ettiğim zaman yaparım, böyle bir huyum var o nedenle eleştirilecek bazı noktalar varmış gibi gözüktü, yanlış bir izlenim ortaya çıkması dışında benim için önerilerin problem değil.

Bu arada yukarıdaki kodda DB'yi dataseti vesair doğrudan kullanmıyorum, onun yerine aktif cell ile ilgili bilgileri yine aktif cell'den alıyorum o nedenle bahsettiğin türden hatalar oluşmuyor.

Benim asıl derdim şu, ki sen de farketmişsin ("bu kadar uzun kod yerine" dediğin kısım) ; yani aşağıda tekrar eden bir kod örneği vereceğim ama bunu daha kısa nasıl yazabilirim onun sıkıntısını yaşıyorum;

( Burada aKriter ile gelen parametre dışında kalan diğer kısımlar çoğunlukla aynı )

Kod: Tümünü seç

          ...
          end else
          if (aKriter = '=') then begin
              if (aAlan2 = '') then begin
                  if (VarIsEmpty(aString) = false) then begin
                      if (ZamanVar = TRUE)
                      then Bicimlendir := eger(aZaman1 = StrToDateTime(aDeger))
                      else Bicimlendir := eger(aString = aDeger);
                  end;
              end else begin
                  if (VarIsEmpty(aString) = FALSE) and (VarIsEmpty(aString2) = FALSE) then begin
                     if (ZamanVar = TRUE)
                     then Bicimlendir := eger(aZaman1 = aZaman2)
                     else Bicimlendir := eger(aString = aString2);
                  end;
              end;
          end else
          if (aKriter = '<') then begin
              if (aAlan2 = '') then begin
                  if (VarIsEmpty(aString) = false) then begin
                      if (ZamanVar = TRUE)
                      then Bicimlendir := eger(aZaman1 < StrToDateTime(aDeger))
                      else Bicimlendir := eger(aString < aDeger);
                  end;
              end else begin
                  if (VarIsEmpty(aString) = FALSE) and (VarIsEmpty(aString2) = FALSE) then begin
                     if (ZamanVar = TRUE)
                     then Bicimlendir := eger(aZaman1 < aZaman2)
                     else Bicimlendir := eger(aString < aString2);
                  end;
              end;
          end else
          ...
xxxjedixxx
Üye
Mesajlar: 216
Kayıt: 10 Ara 2013 03:50

Re: Kod kısaltma hakkında yardım / cxGrid OnCustomDrawCell

Mesaj gönderen xxxjedixxx »

Merhaba,

Yazdığın kodu =, <, >, <=, >= ve <> operatörleri için sadeleştirmeye çalıştım. Diğer "içinde", "gün farkı" vs. olanlar için bir şey yapmadım. Umarım olmuştur. Çünkü test etme şansım yok.

Ayrıca bir kaç ipucu vermekte isterim. "eger" diye bir fonksiyon yapıp kullanmışsın. Buna hiç gerek yok.
Örn;
Karsilastir := eger(aZaman1 < aZaman2) yerine Karsilastir := aZaman1 < aZaman2 yazabilirsin.

Yine,
if (VarIsEmpty(aString) = False) yerine if not VarIsEmpty(aString)
veya
if (VarIsEmpty(aString) = True) yerine if VarIsEmpty(aString) kullanabilirsin.

Aşağıdaki sadeleştirilme için yazılmış bir fonksiyon ve kullanım örneği mevcuttur.

Kod: Tümünü seç

function KontrolEt(pKriter, pAlan2: string; pString, pString2, pDeger: Variant; pZamanVar: Boolean; pZaman1, pZaman2: TDateTime): Boolean;
var kDeger1, kDeger2: Variant;
begin
  Result := False;
  if VarIsEmpty(pString) then Exit;
  if VarIsEmpty(pString2) and (pAlan2 <> '') then Exit;

  if pZamanVar then
  begin
    kDeger1 := pZaman1;
    if pAlan2 = '' then kDeger2 := StrToDateTime(pDeger) else kDeger2 := pZaman2;
  end else
  begin
    kDeger1 := pString;
    if pAlan2 = '' then kDeger2 := pDeger else kDeger2 := pString2;
  end;

  if pKriter = '=' then Result := kDeger1 = kDeger2;
  if pKriter = '<' then Result := kDeger1 < kDeger2;
  if pKriter = '>' then Result := kDeger1 > kDeger2;
  if pKriter = '>=' then Result := kDeger1 >= kDeger2;
  if pKriter = '<=' then Result := kDeger1 <= kDeger2;
  if pKriter = '<>' then Result := kDeger1 <> kDeger2;
end;

//Kullanımı
  Bicimlendir := False;
  if Pos(aKriter, '=,<,>,<=,>=,<>') > 0 then
  begin
    Bicimlendir := KontrolEt(aKriter, aAlan2, aString, aString2, aDeger, ZamanVar, aZaman1, aZaman2)
  end else
  if (aKriter = 'içinde') then
  begin
    ...
  end else
  if (aKriter = 'gün farkı') then
  begin
    ...
  end else ...
Kullanıcı avatarı
cengaver
Üye
Mesajlar: 111
Kayıt: 01 Nis 2014 05:02
Konum: İstanbul

Re: Kod kısaltma hakkında yardım / cxGrid OnCustomDrawCell

Mesaj gönderen cengaver »

Şahanesin xxxjedixxx,
Karsilastir := eger(aZaman1 < aZaman2) yerine Karsilastir := aZaman1 < aZaman2 yazabilirsin.
Şeklinde verdiğin örnek gayet harika, bu tarz dile özgü başka yenilikler de var mı?

(Not: İlgili kod bittiği zaman yine bu konunun en altına son halini ekleyeceğim arkadaşlar, bence herkesin bu tarz içeriğe göre cxgridi renklendiren bir fonksiyona ihtiyacı vardır diye düşünüyorum...)
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Kod kısaltma hakkında yardım / cxGrid OnCustomDrawCell

Mesaj gönderen mrmarman »

cengaver yazdı:Şahanesin xxxjedixxx,
Karsilastir := eger(aZaman1 < aZaman2) yerine Karsilastir := aZaman1 < aZaman2 yazabilirsin.
Şeklinde verdiğin örnek gayet harika, bu tarz dile özgü başka yenilikler de var mı?

(Not: İlgili kod bittiği zaman yine bu konunun en altına son halini ekleyeceğim arkadaşlar, bence herkesin bu tarz içeriğe göre cxgridi renklendiren bir fonksiyona ihtiyacı vardır diye düşünüyorum...)
Merhaba.

- Şerh düşmek istedim.

- Bu durumu gözün kapalı kullanmamanız lazım. Tek bir karşılaştırma için doğrudur

- Diğer türlü; alt alta iki farklı karşılaştırmada birinin false ettiğini diğeri true yapar. Sen de herhangi bir şekilde false olma durumunu arıyorken bunu kaçırabilirsin. Bug oluşur sebebi bulmak insanı çileden çıkarabilir. Tecrübesi olan hak verecektir.
Resim
Resim ....Resim
xxxjedixxx
Üye
Mesajlar: 216
Kayıt: 10 Ara 2013 03:50

Re: Kod kısaltma hakkında yardım / cxGrid OnCustomDrawCell

Mesaj gönderen xxxjedixxx »

Verdiğim kod çalıştı mı acaba bilgi verirsen sevinirim.
Ayrıca İltifatın için teşekkür ederim. Aslında bu verdiğim ip uçları yenilik değil Pascal'dan beri var olan yazım kurallarındandır. Mrmarman bu konuya temkinli yaklaşmış ama Mantıksal Matematik konularını iyi biliyorsan hiç bir sıkıntı olmaz.

Sana verdiğim örnekte tek değişken karşılaştırması olduğu için parantez içine almadım. Eğer birden fazla karşılaştırma yapacaksan zaten kural gereği parantez içine almak zorundasın. Çünkü AND ve OR operatörleri sayılar ve değişenler arası karşılaştırmalarda da kullanıldığı için delphi derleyicisi tarafından karşılaştırmaların parantezle belirtilmesi istenir.

Benzer örnekten devam edersek;

Sonuc := (a < b) and (c > b) and (a < c);
şeklindeki işlem,
if (a < b) and (c > b) and (a < c) then
Sonuc := True
else
Sonuc = False;
ifadesiyle tamamen aynıdır.

Örneğin;
a := 1; b := 3; c := 5; //olsun
Bu durumda yukarıdaki işlemin aslında aşağıdaki gibidir;
Sonuc := True and True and True; // Sonuc = True olur.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Kod kısaltma hakkında yardım / cxGrid OnCustomDrawCell

Mesaj gönderen mrmarman »

Kod: Tümünü seç

Karsilastir := 15 > 10;
Karsilastir := 5 > 8;
Sonuç Karsilastir değeri False

Kod: Tümünü seç

if 15 > 10 then Karsilastir := True;
if 5 > 8 then Karsilastir := True;
Sonuç Karsilastir değeri True

Not:Buradaki değerlerin; birer değişken içinde yer aldığını düşününüz.

Temkinli olmak iyidir.
Resim
Resim ....Resim
xxxjedixxx
Üye
Mesajlar: 216
Kayıt: 10 Ara 2013 03:50

Re: Kod kısaltma hakkında yardım / cxGrid OnCustomDrawCell

Mesaj gönderen xxxjedixxx »

Konuyu uzatmak istemiyorum ama yanlış bilgilendirme olmaması için yazıyorum.

Sonuc := Eger(a>b) diye bir ifade için Sonuc := a>b; ifadesi her zaman aynı çalışır. Çünkü Eger fonksiyonu gelen mantıksal parametre değeri neyse (true yada false) aynen onu geri gönderiyor.

Sonraki verdiğim örnekte ise;
Sonuc := (a < b) and (c > b) and (a < c); ifadesinin karşılığının

if (a < b) and (c > b) and (a < c) then
Sonuc := True
else
Sonuc = False;
olduğunu yazmıştım. Fakat sizin verdiğiniz örnekler, şart sağlanıyorsa değer atanması yönünde olduğu için hiç bir zaman benim belirttiğim gibi yazılamaz.

Eğer;
if 15 > 10 then
Karsilastir := True
else
Karsilastir := False;
olsaydı
Karsilastir := 15 > 10; şekilnde yazılabilirdi.

Zaten bu şekilde arka arkaya yazdığınız zaman
Karsilastir := 15 > 10;
Karsilastir := 5 > 8;
Akıllı derleyicimiz bize "Value assigned to 'Karsilastir' never used" uyarısını verecektir.


Saygılarımla,
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Kod kısaltma hakkında yardım / cxGrid OnCustomDrawCell

Mesaj gönderen mrmarman »

Yani gözü kapalı kullanmıyoruz. Sonuçları okuyoruz. Warnigler de dahil.
Resim
Resim ....Resim
xxxjedixxx
Üye
Mesajlar: 216
Kayıt: 10 Ara 2013 03:50

Re: Kod kısaltma hakkında yardım / cxGrid OnCustomDrawCell

Mesaj gönderen xxxjedixxx »

mrmarman yazdı:Yani gözü kapalı kullanmıyoruz. Sonuçları okuyoruz. Warnigler de dahil.
Fatal Error
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Kod kısaltma hakkında yardım / cxGrid OnCustomDrawCell

Mesaj gönderen mrmarman »

xxxjedixxx yazdı:
mrmarman yazdı:Yani gözü kapalı kullanmıyoruz. Sonuçları okuyoruz. Warnigler de dahil.
Fatal Error

Güzeldi... Program dilindeki karşılığı Fatal Error :bravo:
Resim
Resim ....Resim
Kullanıcı avatarı
cengaver
Üye
Mesajlar: 111
Kayıt: 01 Nis 2014 05:02
Konum: İstanbul

Re: Kod kısaltma hakkında yardım / cxGrid OnCustomDrawCell

Mesaj gönderen cengaver »

:) Muhabbet güzel devam etmiş,

Evet, kodlar çalıştı, biraz ekleme vesair yaptım ama henüz bitmedi, fakat yaptığım şeyin ekran görüntülerini sizinle paylaşabilirim;

Aşağıdaki ekran bu iş için tasarladığım bir editör ekranı
Resim


Bu da verilerin listelendiği bir pencere
Resim
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Kod kısaltma hakkında yardım / cxGrid OnCustomDrawCell

Mesaj gönderen mrmarman »

eline sağlık güzel olmuşlar
Resim
Resim ....Resim
Cevapla