2011-07-27 16 views
5

Ben bir başkası tarafından yazılmış bir Delphi 4-dönem programın kod tabanı modernize ve hataları düzeltmek üzerinde çalışıyorum. Kodların çoğu modern standartlara göre oldukça korkutucu ve ben yardım edemiyorum ama göremediğim bazı şeyler var mıdır, çünkü orijinal yazar belirli standart kütüphane özelliklerini bilmiyordu, ya da t kullanılabilir. Bütün uygulama üzerinde bkz daha iğrenç "desen"TDataset'in Lookup and Locate yöntemleri ne zamandır var?

biri şuna benzer:

table := TClientDataset.Create; 
with table do 
begin 
    CloneCursor(dmDatabase.OriginalTable, false, true); 
    filtered := true; 
    active := true; 
    first; 
    while not EOF do 
    begin 
    if fieldByName('whatever').AsString = 'some criteria' then break; 
    next; 
    end; 
    if EOF then exit; 
    //do something based on the current row of the dataset 
    table.free; 
end; 

Neredeyse bu grupların her biri üzerinde ya Lookup veya Locate için tek satırlık çağrı ile değiştirilebilir olabilir Orijinal veri seti, ara CDS'ye gerek yok. Bu beni şaşırtıyor, bu yöntemler D4 günlerinde geri geldi mi? Lookup ve Locate ilk ne zaman ekledi?

+0

'Bazı ölçütler' bulunamazsa, 'tablo' serbest bırakılmaz? – JRL

+0

@Jrl: Dediğim gibi, bu kodların bazıları modern standartlara göre oldukça korkutucu. : P Ama bu temelde hafızadan genel bir desen olarak yeniden yaratıldı. sonuncu bloklar aslında mevcut olabilir veya olmayabilir. Bazıları var, ama olması gereken kadar değil. –

+1

Bu, işi yapmak için yeterince delphi öğrenmiş biri tarafından yazılmış bir kod gibi görünüyor ve bir şeyleri yapmak için tam olarak bir tane (kaba kuvvet yolu) biliyordu. Delphi 1'de bile yardımcı bir işlev yazabilirdi ve kopya-yapıştırma-hastalığından kaçındı. –

cevap

6

Arama ve Konum Delphi 2'de tanıtıldı. Orijinal yazarı bunlardan yararlanamadığı gibi görünüyor.

+3

+1; Dosya D2-CS-2.0 \ SOURCE \ VCL \ DB.PAS: 810 işlev Bul (const KeyFields: dize; const Anahtar Kelimeler: Variant; –

+5

@Jeroen: * NEDEN * Delphi 2 için VCL kaynağınız var. böyle bir şekilde? 'D-:' – afrazier

+7

@afrazier: herkes değil mi? :) –

6

Orijinal programlayıcı, satır işaretçisinin hiçbir zaman değiştirilmediğinden emin olmak istiyor gibi görünüyor. Locate (veya Lookup) yapmak, veri olaylarının her türünü provoke etmek için satır işaretçisini değiştirir (Datasource.OnDataChange, Dataset.AfterScroll vb.).

TClientDataset.CloneCursor ile yapılan aramada, bu olayların hiçbiri dmDatabase.OriginalTable'da tetiklenmez ve verilerin veritabanından yeniden yüklenmesi gerekmez.

Neyse ki niyet budur. TClientDataset D3'te sunuldu. Ve klonlanmış imleçler, gelişmiş bir özellik olan türüdür ve bir CDS olmak için dmDatabase.OriginalTable gerekir.

+1

Muhtemelen DisableControls/EnableControls ve yer imlerini, her işlem için imleci klonlamak yerine kullanırım. –

+0

'Lookup, satır işaretçisini değiştirmiyor. 'Locate' yapar, ancak birkaç durumda bu, CDS /' CloneCursor' öğeleri olmadan orijinal veri kümesinde yer alır ve temelde 'Locate''in yeniden yapılandırılmasıdır. –

+1

Peki neden klonda 'Bul 'veya' LookUp' kullanmadılar? –