Jede Business-Anwendung enthält dieselbe Seite, für jede Tabelle erneut geschrieben: eine Liste mit einem Suchfeld und einer Seitennavigation, ein Formular zum Anlegen und Bearbeiten, eine Bestätigung zum Löschen und der Code, der schreibt. Unsere eigene Admin-Demo hatte vier Request-Handler und etwa vierhundert Zeilen Seitenaufbau allein für Kunden, dann noch einmal dasselbe für Lieferanten, und noch einmal für Rechnungen.
sgcWebSockets 2026.10 fügt TsgcHTMLComponent_CRUD hinzu, das diese Seite übernimmt. Die Demo baut den Kundenbereich jetzt mit einem Adapter aus sechs Methoden auf und behält die handgeschriebene Version daneben, damit Sie beide lesen können.
Die Seite
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;
An ein Dataset gebunden liest sie ihre eigenen Spalten, und das ist die ganze Seite: Liste, Suche, Seitennavigation, das Formular zum Anlegen und Bearbeiten, die Löschbestätigung und ein CSV-Export dessen, was die Liste gerade zeigt.
Oder Ihr eigenes SQL
Ein Dataset ist eine Möglichkeit, Datensätze zu speichern, nicht die einzige. Alles, was einen Datensatz ändert, läuft über einen Adapter, sodass die Komponente niemals SQL, einen Datensatz oder einen Datenbanktreiber zu Gesicht bekommt:
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));
Sechs Methoden über das, was Sie bereits haben. In der Demo ist jede davon ein einziger Aufruf auf den Datenbankpool der Anwendung.
Die Teile, die Sie als Nächstes geschrieben hätten
Optimistisches Sperren. Nennen Sie eine Versionsspalte, und ein Speichervorgang vergleicht, was der Browser sendet, mit dem, was gespeichert ist, sodass der zweiten Person, die auf Speichern klickt, mitgeteilt wird, dass sich der Datensatz geändert hat, statt den ersten stillschweigend zu überschreiben:
FCRUD.VersionField := 'UPDATED_AT';
Master und Detail. Die untergeordneten Listen eines Datensatzes sind weitere CRUD-Komponenten, die unter dem Formular gerendert werden, während der Datensatz bearbeitet wird:
with FCRUD.Details.Add do
begin
CRUD := FCRUDOrderLines;
MasterField := 'ORDER_ID';
Caption := 'Lines';
end;
Validierung, die um Ihre Daten geht, nicht um Formulare. Pflichtspalten sind Aufgabe der Komponente; OnValidate ist der Ort, an dem die Regeln leben, die sich um Kunden drehen. Fügen Sie pro Problem eine Zeile hinzu, dann wird der Schreibvorgang verweigert und das Formular kommt mit diesen Meldungen zurück.
Zwei Wege zum Einstieg
In der IDE gibt es jetzt einen Assistenten: Tools › New sgcHTML CRUD page. Nennen Sie die Tabelle, den Schlüssel und die Spalten, und die Komponente wird auf dem gerade entworfenen Formular angelegt, mit den zwei Zeilen, die sie verdrahten, bereits in der Zwischenablage.
Außerhalb der IDE gibt es ein Kommandozeilen-Tool, sgcHTMLGen, das den Quelltext der Seite in Object Pascal oder in C# schreibt:
sgcHTMLGen crud --table Customers --prefix /customers ^
--fields "ID:key CODE:req:32 NAME:req:120 CITY:80 NOTES:noform"
Wie die Seite antwortet
Jedes Steuerelement der Seite postet auf dieselbe Weise: das Suchfeld, die Schaltfläche Neu, das Bearbeiten und Löschen einer Zeile sowie das Formular selbst tragen drei versteckte Felder, action, crud und, wo es eine Bedeutung hat, key. Der Host liest sie aus und ruft ProcessAction auf, das das einzusetzende Markup zurückliefert.
Eine über den Socket gesendete Nachricht trägt keinen Pfad, sodass sie nie den Router erreicht und nie dessen eigene Prüfung durchläuft. Sie zu autorisieren ist Aufgabe der Anwendung, und die Engine gibt Ihnen jetzt an die Hand, was dafür nötig ist:
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;
Der vom Browser ankommende Schlüssel wird gesucht, bevor irgendein Schreibvorgang läuft, sodass ein Schlüssel, der niemandem gehört, nichts schreibt.
Beide Versionen ansehen
In Demos\60.HTML\01.RunTime\02.AdminCRUD ist /customers die Komponente und /customers-classic die Seite, die sie ersetzt. Dieselbe Datenbank, dieselben Daten, derselbe Look. Eine der beiden ist vierhundert Zeilen kürzer.
Aktualisierung
Die Komponente ist Teil von sgcHTML und rein additiv: An einer bestehenden Seite ändert sich nichts, bis Sie eine auf ein Formular ziehen.
Weiterlesen
- Stellen Sie Ihrem Delphi-Grid eine Frage in einfachem Englisch
- Einen geschlossenen Browser von Delphi aus erreichen
- sgcWebSockets 2026.10, alles andere in dieser Version
Video ansehen
Dazu gibt es ein kurzes Video auf dem eSeGeCe-Kanal.
Fragen, Feedback oder Hilfe bei der Migration? Kontaktieren Sie uns — Sie erhalten eine Antwort von den Leuten, die den Code geschrieben haben.
