Beş Dakikada Delphi Web CRUD Sayfası

· Bileşenler
Beş Dakikada Delphi Web CRUD Sayfası

Her iş uygulaması, her tablo için yeniden yazılan aynı sayfayı içerir: bir arama kutusu ve bir sayfalama olan bir liste, oluşturmak ve düzenlemek için bir form, silmek için bir onay, ve yazan kod. Kendi admin demomuzda yalnızca müşteriler için dört istek işleyicisi ve yaklaşık dört yüz satır sayfa oluşturucu vardı, ardından tedarikçiler için aynısı, ve faturalar için yine aynısı tekrarlanıyordu.

sgcWebSockets 2026.10, o sayfaya sahip olan TsgcHTMLComponent_CRUD'u ekliyor. Demo artık müşteriler alanını altı metotluk bir adaptörle oluşturuyor, ve ikisini de okuyabilmeniz için elle yazılmış sürümü yanında tutuyor.

Sayfa

uses
  sgcHTML_Component_CRUD;

FCRUD := TsgcHTMLComponent_CRUD.Create(Self);
FCRUD.CRUDID := 'customers';
FCRUD.RoutePrefix := '/customers';
FCRUD.Title := 'Customers';
FCRUD.KeyField := 'ID';
FCRUD.PageSize := 15;
FCRUD.Actions := [caCreate, caEdit, caDelete, caView, caExport];
FCRUD.DataSet := FDQueryCustomers;

Bir veri kümesine bağlandığında kendi sütunlarını okur, ve sayfanın tamamı budur: liste, arama, sayfalama, oluşturma ve düzenleme formu, silme onayı ve listenin gösterdiği her şeyin CSV olarak dışa aktarılması.

Ya da Kendi SQL'iniz

Bir veri kümesi, kayıtları saklamanın bir yoludur, tek yolu değil. Bir kaydı değiştiren her şey bir adaptörden geçer, bu yüzden bileşen hiçbir zaman SQL'i, bir kaydı veya bir veritabanı sürücüsünü görmez:

type
  TCustomersAdapter = class(TsgcHTMLCRUDAdapter)
  public
    function Locate(const aKey: string): Boolean; override;
    function Read(const aKey: string; aValues: TStrings): Boolean; override;
    function List(const aSearch: string; aPage, aPageSize: Integer;
      aRows: TStrings): Integer; override;
    function Insert(aValues: TStrings; var aKey: string;
      aErrors: TStrings): Boolean; override;
    function Update(const aKey: string; aValues, aErrors: TStrings)
      : Boolean; override;
    function Delete(const aKey: string; aErrors: TStrings): Boolean; override;
  end;

FCRUD.SetAdapter(TCustomersAdapter.Create(FCRUD));

Zaten sahip olduğunuz her şey üzerinde altı metot. Demoda her biri, uygulamanın veritabanı havuzu üzerinde tek bir çağrıdır.

Sırada Yazacağınız Parçalar

İyimser kilitleme. Bir sürüm sütunu belirtin, ve bir kayıt işlemi tarayıcının gönderdiğini saklanmış olanla karşılaştırır, böylece Kaydet'e ikinci basan kişiye, kaydın sessizce üzerine yazılması yerine kaydın değiştiği söylenir:

FCRUD.VersionField := 'UPDATED_AT';

Ana ve alt kayıt. Bir kaydın alt listeleri, kayıt düzenlenirken formun altında görüntülenen diğer CRUD bileşenleridir:

with FCRUD.Details.Add do
begin
  CRUD := FCRUDOrderLines;
  MasterField := 'ORDER_ID';
  Caption := 'Lines';
end;

Formlarla değil, verilerinizle ilgili doğrulama. Zorunlu sütunlar bileşenin işidir; müşterilerle ilgili kurallar ise OnValidate içinde yaşar. Her sorun için bir satır ekleyin, yazma reddedilir ve form bu satırlarla birlikte geri döner.

Başlamanın İki Yolu

IDE'de artık bir sihirbaz var: Tools › New sgcHTML CRUD page. Tabloyu, anahtarı ve sütunları adlandırın; bileşen, tasarlanmakta olan form üzerinde oluşturulur ve onu bağlayan iki satır panoya kopyalanmış olarak gelir.

IDE dışında, sayfanın kaynağını Object Pascal veya C# dilinde yazan bir komut satırı aracı olan sgcHTMLGen vardır:

sgcHTMLGen crud --table Customers --prefix /customers ^
  --fields "ID:key CODE:req:32 NAME:req:120 CITY:80 NOTES:noform"

Sayfa Nasıl Yanıt Veriyor

Sayfanın her kontrolü aynı şekilde gönderim yapar: arama kutusu, Yeni düğmesi, bir satırın Düzenle ve Sil'i ve formun kendisi üç gizli alan taşır: action, crud ve, anlamlı olduğu yerde, key. Sunucu bunları okur ve yerine geçecek işaretlemeyi yanıtlayan ProcessAction'ı çağırır.

Soket üzerinden gönderilen bir mesaj hiçbir yol taşımaz, bu yüzden hiçbir zaman yönlendiriciye ulaşmaz ve yönlendiricinin kendi kontrolünden hiçbir zaman geçmez. Bunu yetkilendirmek uygulamanın işidir, ve motor artık bunun için gerekeni size veriyor:

oSession := FHTMXEngine.MessageSession(aConnection, FAuth);
try
  if not Assigned(oSession) then
    Exit;   // a write with nobody behind it is not a write
  oPage.ProcessAction(vAction, oParams.Values['key'], oParams, aResponse);
finally
  oSession.Free;
end;

Tarayıcıdan gelen anahtar, herhangi bir yazma işlemi çalıştırılmadan önce bulunur, bu yüzden kimseye ait olmayan bir anahtar hiçbir şey yazmaz.

Her İki Sürümü de Görün

Demos\60.HTML\01.RunTime\02.AdminCRUD içinde, /customers bileşendir ve /customers-classic yerini aldığı sayfadır. Aynı veritabanı, aynı veri, aynı görünüm. İkisinden biri dört yüz satır daha kısadır.

Yükseltme

Bileşen sgcHTML'in bir parçasıdır ve ekleme niteliğindedir: siz bir formun üzerine birini bırakana kadar mevcut bir sayfada hiçbir şey değişmez.

Sırada Ne Var

İzleyin

Bununla ilgili kısa bir video, eSeGeCe kanalında yer alıyor.

Sorularınız, geri bildiriminiz veya taşıma konusunda yardıma mı ihtiyacınız var? İletişime geçin — kodu yazan kişilerden yanıt alacaksınız.