Vývoj aplikace klient-server v Delphi. Vytvoření aplikace klient-server v Delphi

Pro vývoj aplikace Telefonní seznam se používá vizuální programovací prostředí Delphi 7 Projekt programu bude obsahovat tři okna:

  • 1. fMain - hlavní forma programu.
  • 2. fEditor - formulář pro přidávání/úpravu záznamů.
  • 3. fDM - datový modul.

Na formulář fDM přidáme komponentu ADOConnection, 1 komponentu typu ADOTable, 1 komponentu typu DataSource. Poklepejte na vlastnost ConnectionString komponenty ADOConnection. Otevře se okno pro připojení komponenty k ADO (obr. 2):

Puc. 2. Okno pro připojení k ADO.

Klepněte na tlačítko Sestavit. Otevře se nové okno (obr. 3.) obsahující nastavení připojení:

Rýže. 3.

Vyberte poskytovatele dat – Microsoft OLE DB Provider pro SQL Server. Na kartě Připojení: vyberte název serveru, na kterém se nachází vaše databáze. Nyní nastavíme vlastnost Connected na hodnotu True. Změňme následující vlastnosti ADOTable: Connection to ADOConnection1; Název_tabulky na předplatiteli; Aktivní na True. Změňte následující vlastnosti DataSource (toto bude odkaz na tabulku): DataSet na ADOTable.

Pojďme k hlavnímu formuláři. Vyberte příkaz Soubor -> Použít jednotku a připojte k němu modul DM. Nyní budeme moci vidět tabulky z hlavního formuláře.

Umístíme komponenty na hlavní formulář. Jsou umístěny v oblasti hlavního okna integrovaného prostředí, které se nazývá paleta komponent (obr. 4.).

Rýže. 4.

Do hlavního formuláře fMain (obr. 5) přidáme tři tlačítka. Jsou určeny pro úpravu aktuálního záznamu, přidání nového a jeho odstranění.

Obr.5.

Záložka DataControls se zaměřuje na vizuální (uživatelem viditelné) komponenty zobrazení dat, jako je DBGrid (mřížka, která zobrazuje všechna data v tabulce a umožňuje vám je upravovat), DBEdit (pole pro úpravy dat určené pro zadávání nebo úpravu jednoho pole záznam, tedy buňky tabulky), DBMemo (pro úpravu polí MEMO) atd. Jedinou výjimkou je komponenta DBNavigator. Tato komponenta není určena pro zobrazování dat, ale pro pohyb v záznamech datové sady, vkládání nového záznamu nebo mazání starého. Přidejte a vyberte DBGrid, v jeho vlastnosti DataSource vyberte fDM.ADOTable. Mřížka zareagovala a vidíme názvy polí (obr. 6.).

Rýže. 6.

Nyní vytvoříme filtr záznamů na základě různých kritérií. Chcete-li to provést, přidejte do formuláře dvě součásti GroupBox. V inspektoru objektů (obr. 7.) ve vlastnosti Caption komponenty GroupBox1 zadejte „Filtrovat podle jednoho pole“ a pro komponentu GroupBox2 „Filtrovat podle několika polí“.

Obr.7.

Na GroupBox1 přidáme 3 štítky, 1 ComboBox, 1 Edit a 2 RadioButtons. Pro Label1 ve vlastnosti Caption napíšeme „Search in“, pro Label2 „Enter data“, pro Label3 „Metoda“. Ve vlastnosti Items komponenty ComboBox zadejte dva řádky: příjmení, telefon (obr. 8.).

Obr.8.

RadioButton má vlastnost Caption „Od začátku řádku“ a „Jakýkoli výskyt“. Na druhém GroupBoxu přidejte tři štítky s vlastností Caption: Last Name, First Name, Phone. Tři komponenty Edit a jedno tlačítko s vlastností Caption „Najít“. A přidejte do formuláře další tlačítko pro odstranění filtru.

Nyní vytvoříme okno editoru dat. Vytvoříme nový formulář (Soubor -> Nový -> Formulář). Přejmenujme jeho vlastnost Name na fEditor. Příkazem Soubor -> Použít jednotku připojíme datový modul DM k formuláři. Nyní musíme do formuláře nainstalovat následující komponenty: 8 Label, 7 DBEdit, 1 DBComboBox.

Pojďme dokončit komponentu DBComboBox. Poklepáním na jeho vlastnost Items otevřete editor. Zadáme do něj tři řádky:

ulice

pruh

Avenue

Uložte text kliknutím na OK.

Pojďme připojit ovládací prvky. Podíl , vyberte všechny ovládací prvky (všechny komponenty kromě Label). V jejich vlastnosti DataSource vyberte fDM.DSLichData a připojte komponenty k požadované sadě dat (tabulce). Odeberme obecný výběr a vybereme první DBEdit. Ve vlastnosti DataField vyberte pole „Příjmení“. Tato vlastnost spojuje vybranou komponentu s konkrétním polem tabulky. Stejným způsobem připojíme zbývající součástky k odpovídajícím polím.

V pravé dolní části nainstalujte navigační komponentu DBNavigator ze záložky Data Controls. Tato komponenta je navržena tak, aby procházela záznamy, umožňovala režim editace záznamů, ukládala nebo rušila provedené změny, přidala nový záznam nebo odstranila existující. V jeho vlastnosti DataSource vyberte fDM.DSLichData pro připojení komponenty k hlavní tabulce. Od této komponenty potřebujeme pouze možnost přejít na začátek nebo konec tabulky, na další nebo předchozí záznam. Rozšiřme proto jeho vlastnost VisibleButtons (viditelnost tlačítek komponenty) a nastavme všechna tlačítka na False kromě nbFirst, nbPrior, nbNext a nbLast. Kliknutím na tato tlačítka zavoláte odpovídající metody komponenty ADOTable. Tyto metody provádějí následující:

První - přejde na první záznam tabulky. Před - přechod na předchozí záznam. Další - přechod na další záznam. Poslední – přechod na poslední záznam.

Když DBNavigator zbývá pouze čtyři tlačítka, budou tato tlačítka prodloužena. Zmenšeme šířku komponenty, aby tlačítka získala známější vzhled.

fDM.TLichData.Append;

DBEdit1.SetFocus;

Metodou Append přidáme do tabulky nový záznam. Dále přeneseme vstupní fokus do DBEdit1, aby to uživatel nemusel dělat sám.

pokud fDM.TLichData.Modified pak

fDM.TLichData.Post;

Zde uložíme případné změny v tabulce a zavřeme okno.

Pojďme k hlavnímu formuláři. Začněme tlačítkem „Nový předplatitel“. Do každé tabulky budete muset přidat nový záznam a poté otevřít okno editoru:

fDM.TLichData.Append;

fEditor.ShowModal;

Pojďme vygenerovat proceduru OnClick pro tlačítko „Upravit“. Bude existovat pouze jeden řádek kódu:

fEditor.ShowModal;

V důsledku toho se otevře okno editoru a komponenty zobrazí data aktuálního záznamu.

Kód pro tlačítko "Smazat":

fDM.TLichData.Delete;

Pojďme k filtrování dat. V tomto filtru vybereme vyhledávací pole, vybereme metodu a zadáme údaje.

Pojďme vygenerovat událost OnChange pro komponentu Edit2.

if ((Length(Edit2.Text) > 0)and(Length(ComboBox1.Text) > 0)) then

fDM.TLichData.Filtered:=false;

pokud RadioButton1.Checked then

fDM.TLichData.Filter:=Combobox1.Text + " LIKE " + #39 + Edit2.Text + "%" + #39

fDM.TLichData.Filter:=Combobox1.Text + " LIKE "+ #39+ "%" + Edit2.Text + "%" + #39;

fDM.TLichData.Filtered:=true;

else fDM.TLichData.Filtered:=false;

Řádek podmínky filtru znamená následující - vyberte ze sloupce ty záznamy, které začínají stejnými znaky jako ty, které jste zadali v Edit2.Text.

Klíčové slovo LIKE umožňuje porovnávat řetězce pomocí daného vzoru. V tomto případě potřebujete vědět následující:

symbol "%" (procenta) - nahrazuje libovolnou sekvenci znaků.

Znak #39 - znamená číslo znaku " (jednoduché uvozovky) v tabulce ASCII kódu. Faktem je, že hodnota pro filtrování musí být uvedena v jednoduchých uvozovkách, a protože jednoduché uvozovky se v Delphi používají k omezení řetězců, pak k vložte do řetězce jednu uvozovku, je třeba ji umístit dvakrát.

Filtrujte podle více polí. Pojďme vygenerovat událost OnClick pro tlačítko Najít.

procedure TfMain.Button3Click(Sender: TObject);

fDM.TLichData.filtered:=false;

if length(edit4.text) > 0 then

filtr:= "PŘÍJMENÍ LIKE "+ #39 + Edit4.Text + "%" + #39;

if length(edit5.text) > 0 then

pokud délka (filtr) >

filtr:=filtr + add + "NAME LIKE "+ #39 + Edit5.Text + "%" + #39;

if length(edit6.text) > 0 then

if length(filtr) > 0 then add:= " a " else add:="";

filtr:=filtr + přidat + "telefon LIKE "+ #39 + Edit6.Text + "%" + #39;

pokud délka (filtr) > 0 pak

fDM.TLichData.Filter:= filtr;

fDM.TLichData.filtered:=true;

Showmessage("Všechna pole jsou prázdná!");

Chcete-li filtr deaktivovat, klikněte na tlačítko „Odstranit filtr“. Její kód je takto:

fDM.TLichData.Filter:= "";

fDM.TLichData.Filtered:= false;

Jelikož je aplikace jednoduchá, rozhodl jsem se použít databázi MS Jet 4.0 (jinými slovy databázi MS Access). Toto rozhodnutí je způsobeno tím, že Jet (nepleťte si jej s MS Access) je bezplatný produkt a je dodáván s MS Windows (to znamená, že pro fungování našeho programu není nutné instalovat samotný Access na počítač klienta ). A editor databází je velmi dobrý a jádro podporuje spoustu typů polí, aby uspokojilo ty nejzvrácenější touhy při ukládání dat.

Vytvořme si tedy novou databázi, nazvěme ji Test a uložíme do složky C:\ClientServer\Server\Data (z pochopitelných důvodů proces vytváření nové databáze v Accessu vynechávám a uvedu pouze strukturu tabulky zahrnuté v naší databázi).

1. Tabulka jedna, říkejme tomu První (no, nejsem spisovatel!)

2. Druhý stůl, a nazvěme to nějak chytře - Druhý

No, to je vše, se základnou a je to.

2. Program
2.1. Aplikační server.

Vytvoříme novou aplikaci a uložíme ji pod názvem Server do složky C:\ClientServer\Server. Do aplikace přidáme Remote Data Module ze záložky Multitier repozitáře (obr. 1).

Při přidávání RDM se průvodce přidáním zeptá na parametry tohoto modulu - tam zadáme název našeho serveru „Test“.

Vše ostatní necháme beze změny. Po kliknutí na tlačítko „Ok“ se v projektu objeví formulář podobný běžnému datovému modulu s názvem Test. Uložme to pod jménem RDMFrm.pas.

Položme na něj komponenty ADOConnection (jeden kus), ADOTable a DataSetProvider (po dvou kusech). Komponenty ADOTable a DataSetProvider nazvěme adotFirst, adotSecond, dspFirst a dspSecond. Dvojitým kliknutím na komponentu ADOConnection se objeví průvodce Connection String. Vyberte položku "Použít připojovací řetězec" a klikněte na tlačítko Sestavit. V okně "Datové připojení Vlastnosti", které se zobrazí, vyberte "Microsoft Jet 4.0 OLE DB Provider" a klikněte na tlačítko "Další". V záložce "Připojení" zadejte cestu k databázi, klikněte na tlačítko "Zkontrolovat připojení" a obdržíte zprávu, že kontrola připojení byla dokončena. Poté průvodce zavřete kliknutím na tlačítko OK. Komponenta ADOConnection má také vlastnost nazvanou LoginPrompt, kterou nastavíme na False a Connected na True. U komponent ADOTable nastavte vlastnost Connection na ADOConnection výběrem z rozevíracího seznamu. Nastavte vlastnost TableName na First a Second. Vlastnost CursorType je ctDynamic, vlastnost TableDirect je True. Zavolejte FieldsEditor a přidejte tam všechna pole.

Pro komponenty DataSetProvider:

V tomto bodě lze proces vytváření primitivního serveru MIDAS považovat za dokončený. Chcete-li zaregistrovat server v subsystému DCOM, musíte spustit aplikaci s parametrem /regserver - Server.exe /regserver.
A posledním dotekem je aplikace SocketServer od společnosti Borland, která se nachází ve složce Delphi?/Bin/scktsvr.exe. Aby klient viděl server, musíte spustit scktsvr.exe (pokud máte nainstalovaný Win NT/w2k/XP, můžete si tuto aplikaci zaregistrovat jako službu; k tomu je třeba ji spustit se scktsvr .exe / parametr install)

2.2. Klientská aplikace

Vytvoříme novou aplikaci a uložíme ji do složky C:\ClientServer\Client pod názvem Klient. Umístíme na hlavní formulář dvě komponenty, každou ClientDataSet (říkejme jim cdsFirst, cdsSecond), DataSource (říkejme jim dsFirst, dsSecond), DBGrid (říkejme jim dbgFirst, dbgSecond) a jednu komponentu SocetConnection.

SocetConnection

Pokud jste udělali vše správně, pak když nastavíte vlastnost Connected na True, měla by se spustit serverová aplikace.

ClientDataSet

Spustíme Editor polí (dvojklik na komponentu) a přidáme tam všechna pole. Pro komponenty ClientDataSet napíšeme handler sdsAfterPost

A nahraďte jej zpracováním událostí AfterPost obě sady ClientDataSets.

Zdroj dat

Vlastnictví Význam
DataSetcdsFirst respektive cdsSecond

DBGrid

Vlastnictví Význam
Zdroj datdsFirst a dsSecond

Spustíme Column Editor (dvojklik na komponentu) a přidáme tam všechna pole.
Umístíme tlačítko na formulář poblíž mřížek a zapíšeme ho do obslužné rutiny onClick.

Nejprve tedy o komponentě serveru IdTCPServer(záložka do knihy Indy servery). Aby bylo možné využívat možnosti serveru, musí být tato komponenta umístěna na formuláři (nezobrazitelná komponenta). Při konfiguraci komponenty jsou užitečné následující vlastnosti:

  • Aktivní – aktivuje nebo deaktivuje server (výchozí False);
  • Vazby – konfiguruje serverové sokety (připojuje je ke konkrétnímu portu počítače, umožňuje nastavit rozsah IP adres a klientských portů pomocí dialogového okna nastavení vlastností Vazba;
  • ListenQueue – číselná hodnota, která omezuje maximální počet požadavků na připojení od klientů ve frontě;
  • MaxConnections - umožňuje omezit maximální počet klientů připojených k serveru;

Podívejme se blíže na nastavení serverových soketů pomocí vlastnosti Bindings. Takže na Obr. Obrázek 1 ukazuje, jak používat dialogové okno Vlastnosti Vazba nakonfigurujte server tak, aby obsluhoval klienty s libovolnými IP adresami, se serverovým soketem připojeným k portu 12340.

Rýže. 1. Nastavení vlastnosti Vazba.

V tomto okamžiku můžete dokončit konfiguraci serveru (ačkoli zde nejsou využity všechny možnosti komponenty IdTCPServer). Hlavní práce serveru při zpracování klientských požadavků může být implementována v obsluze události OnExecute. Tomuto ovladači je předán odkaz na objekt TIdContext - vlákno spojené s klientem připojeným k serveru. Prostřednictvím tohoto objektu (přesněji jeho vlastnosti Connection) můžete přijímat a odesílat data a také přijímat a nastavovat mnoho užitečných parametrů připojení. První příklad použití objektu TIdContext při zpracování požadavku klienta je uveden ve výpisu 1.

Nyní se podívejme, jak nakonfigurovat klienta (IdTCPClient - karta Indy klienti), aby byl schopen komunikovat s naším serverem. Chcete-li použít komponentu TCP klient, stačí ji umístit na formulář (komponenta se také nezobrazuje).

Poté musíte minimálně nakonfigurovat následující vlastnosti (zbytek je podle potřeby uveden v příkladech níže):

  • Host – název nebo IP adresa počítače, na kterém server běží;
  • Port - číslo portu, ke kterému je serverový soket připojen.

Obecně není nutné konfigurovat ani tyto vlastnosti ve fázi vývoje formuláře. Aplikace je mnohem flexibilnější, pokud má uživatel například možnost vybrat (nebo zadat) název nebo adresu serveru.

Snadná výměna dat

Při zahájení práce s komponentami popsanými v předchozí části IdTCPServer A IdTCPClient Zvažme vytvoření jednoduché klient-server aplikace, jejíž klientská a serverová část plní následující funkce.

  • Klientská aplikace se připojí k serveru a odešle mu řetězec zadaný uživatelem, čeká na odpověď, zobrazí text přijatý ze serveru a odpojí se od serveru.
  • Serverová aplikace přijme řetězec od klientské aplikace a odešle odpověď (také textovou), načež uzavře spojení. Navíc se počítá počet obsluhovaných klientů a pamatuje se IP adresa počítače, ze kterého přišel poslední požadavek.

Implementace serverových i klientských aplikací je v našem případě extrémně jednoduchá. Je volán projekt serverové aplikace SimpleServer. Vzhled serverového formuláře (za běhu aplikace) je na obr. 2.

Rýže. 2. Vzhled jednoduchého serveru

Textové pole ( Upravit) s počtem zpracovaných požadavků se nazývá txtCount a textové pole s adresou posledního obsluhovaného počítače se nazývá txtFrom . Celý úkol serveru je zpracovat událost Execute pro komponentu IdTCPServer umístěn na formuláři (tuto komponentu připojte k portu 12340 a nastavte vlastnost Active na True) (Výpis 1).

Výpis 1. Jednoduchá implementace serveru

Procedure TForm1.FormCreate(Sender: TObject); begin section:= TCriticalSection.Create; konec; procedure TForm1.IdTCPServer1Execute(AContext: TIdContext); var strText: String; begin //Přijetí řetězce od klienta strText:= AContext.Connection.Socket.ReadLn; //Odpověď AContext.Connection.Socket.WriteLn("Zabral řádek: " + strText); //Aktualizujte informace ve formuláři serveru (server je vícevláknový, //proto používáme synchronizaci section.Enter; Inc(processed, 1); txtCount.Text:= IntToStr(processed); txtFrom.Text:= AContext .Connection.Socket.Binding section.Leave;

Při odpovědi klientovi server pouze opakuje řádek přijatý od něj s přidáním textu "Přijato:" na začátek řádku.

Analýza výpis 1, můžete vidět, že i na dotyčném nejjednodušším serveru jsme museli použít synchronizaci při aktualizaci vzhledu formuláře pomocí kritické sekce (do sekce použití musíte dodatečně přidat název modulu SyncObjs).

Nyní se podívejme na implementaci klientské části (projekt SimpleClient). Vzhled klientské aplikace je na Obr. 2.

Rýže. 2. Vzhled klienta

Aby klientská aplikace fungovala, je přirozeně do formuláře umístěna instance komponenty IdTCPClient(jeho název je IdTCPClient1). Vlastnost Port této komponenty by měla být nastavena na 12340. Textové pole ( Upravit) zadejte řetězec, který má být odeslán na jiný než server, s názvem txtMessage . Textové pole ( Upravit), do kterého se zadává název nebo adresa serveru, se nazývá txtServer. Pole s řádky odpovědí ( Memo) má název txtResults.

Veškerá práce klientské aplikace se provádí po stisknutí tlačítka Rukojeť. Text odpovídajícího handleru je uveden v výpis 2.

Výpis 2. Jednoduchá implementace klienta

Procedure TForm1.Button1Click(Sender: TObject); begin //Připojte se k serveru a odešlete mu zadaný příkaz IdTCPClient1.Host:= txtServer.Text; IdTCPClient1.Connect; IdTCPClient1.Socket.WriteLn(txtMessage.Text); txtMessage.Text:= ""; //Počkejte na odpověď a uzavřete připojení txtResults.Lines.Append(IdTCPClient1.Socket.ReadLn); IdTCPClient1.Odpojit; konec;

To je vše, nyní můžete provozovat server a klienty (na libovolném počtu počítačů) a sledovat výsledky jejich práce. Jen nezapomeňte spustit server, než k němu přistoupíte pomocí klientského programu.

Zdroj . Vyrobeno na Delphi XE.

Monitorování počítače přes síť (IdTCPServer, IdTCPClient)

Nyní se podívejme na zajímavější příklad použití síťových komponent IdTCPServer A IdTCPCLient, což může být užitečné pro lidi zabývající se správou síťových počítačů.

Serverový program je předem spuštěn na monitorovaném počítači. V tomto příkladu serverový program umožňuje klientskému programu získat následující informace o počítači, na kterém je (serverový program) spuštěn:

  • rozlišení monitoru;
  • barevná hloubka pro monitor;
  • kopie obrazovky v plné velikosti;
  • kopii obrazovky zmenšenou (nebo zvětšenou) na určenou velikost.

K získání zadaných informací musí klientský program odeslat na server následující řetězcové hodnoty:

  • get_screen_width- získat šířku a get_screen_height- získat výšku obrazovky v pixelech;
  • get_screen_colors- získat hodnotu barevné hloubky nastavené pro monitor (bity na bod);
  • get_screen- získat kopii obrazovky v plné velikosti;
  • get_screen: X, Y- k získání kopie obrazovky zmenšené na velikost X x Y.

Nejprve se podívejme na implementaci serveru (projekt SpyServer). Veškerý kód, díky kterému server funguje, je umístěn v modulu Jednotka1.pas formuláře Formulář1. Obsluha klientských požadavků, hlavní procedura pro server, je uvedena ve výpisu 3.

Výpis 3. Obsluha klientských požadavků

Procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread); var strText: String; šířka, výška, i: celé číslo; dc:HDC; begin //přijetí řetězce od klienta strText:= AThread.Connection.ReadLn; //určete, co je třeba udělat, pokud strText = "get_screen_height" then //vrátí výšku obrazovky AThread.Connection.WriteInteger(Screen.Height) else if strText = "get_screen_width" then //vrátí šířku obrazovky AThread.Connection.WriteInteger (Screen. Width) else if strText = "get_screen_colors" then begin //vrátí počet bitů na bod dc:= GetDC(0); AThread.Connection.WriteInteger(GetDeviceCaps(dc, BITSPIXEL)); ReleaseDC(0, dc) end else if strText = "get_screen" then //vrátí kopii obrazovky v plné velikosti SendScreen(Screen.Width, Screen.Height, AThread.Connection) else begin //řetězec jako "get_screen: x, y" // Určíme hodnoty výšky a šířky předané uživatelem strText:= Copy(strText, 12, Length(strText) - 11); i:= Pos(",", strText); //šířka pozice čárky:= StrToInt(Copy(strText, 1, i - 1)); výška:= StrToInt(Kopírovat(strText, i+1, Délka(strText) - i)); //vrácení kopie obrazovky SendScreen(width, height, AThread.Connection); konec; konec;

Procedura SendScreen použitá ve výpisu 3, která odesílá kopii obrazovky klientovi, je uvedena ve výpisu 4.

Výpis 4. Pořízení snímku obrazovky

//procedura vezme kopii obrazovky, převede výsledný //obrázek na zadanou velikost a //převedený obrázek odešle do procedury klientského programu SendScreen(width1: Integer; height1: Integer; Connection: TIdTCPServerConnection); var ScreenCopy: TCanvas; gr: TBitmap; stream: TMemoryStream; rcDest, rcSource: TRect; begin rcDest:= Obdélník(0,0,šířka1,výška1); //konečná velikost obrázku rcSource:= Screen.DesktopRect; //počáteční velikost obrázku //vytvořte plátno a připojte jej ke kontextu plochy ScreenCopy:= TCanvas.Create; ScreenCopy.Handle:= GetDC(0); //vytvoří objekt pro uložení kopie obrazovky a zkopíruje obrázek gr:= TBitmap.Create; gr.Výška:= výška1; gr.Width:= width1; gr.Canvas.CopyRect(rcDest, ScreenCopy, rcSource); ReleaseDC(0, ScreenCopy.Handle); //uložení obrázku do datového proudu:= TMemoryStream.Create; gr.SaveToStream(stream); //odešlete obrázek klientovi Connection.WriteStream(stream, true, true); proud.Jasný; stream.Free; gr.Free; konec;

Jak vidíte, i ta nejsložitější operace daného serveru - kopírování obrazu - je implementována zcela jednoduše díky přítomnosti takové standardní třídy, jako je TMemoryStream.

Komponent IdTCPServer(pojmenovaný IdTCPServer1) je v tomto příkladu připojen k portu 12341 (nezapomeňte také nastavit vlastnost Active = True).

Nyní o implementaci klientské aplikace (projekt SpyClient). Vzhled klientského formuláře (Form1) během provozu je znázorněn na Obr. 3 (je zřejmé, že uživatel sledovaného počítače právě prohrál hru Hledání min).

Rýže. 3

Popisy, názvy a hodnoty ručně konfigurovaných vlastností nejdůležitějších komponent klientského formuláře jsou uvedeny v tabulce 1.

Stůl 1. Hlavní součásti formuláře klienta pro sledování a jejich vlastnosti

Klientská aplikace začíná připojením k serveru. Kód pro tuto operaci je uveden ve výpisu 5.

Výpis 5. Připojování k serveru

Procedure TForm1.cmbConnectClick(Sender: TObject); begin if cmbConnect.Caption = "Connect" then begin if txtServer.Text = "" then //není zadáno žádné jméno serveru MessageDlg("Do textového pole zadejte název serveru", mtInformation, , 0) else begin // připojit se k serveru IdTCPClient1.Host:= txtServer.Text; zkuste IdTCPClient1.Connect; kromě MessageDlg("Nelze se připojit k zadanému serveru", mtError, , 0); Výstup;

Pokud je připojení k serveru úspěšné, spustí se obslužná rutina TForm1.IdTCPClient1Connected, která připraví klientskou aplikaci na periodické požadavky na data ze serveru (výpis 6).

Výpis 6. Akce provedené při připojení k serveru

Procedure TForm1.IdTCPClient1Connected(Sender: TObject); begin txtServer.Enabled:= False; cmbConnect.Caption:= "Odpojit"; //začne pravidelně vyžadovat data ze serveru Timer1.Enabled:= True; //provede první požadavek bez čekání na spuštění časovače Timer1Timer(nil); konec;

Při odpojení od serveru se také provádějí akce, které zastaví periodické požadavky na data a uvedou klienta do stavu čekání na připojení (počáteční stav programu) (výpis 7).

Výpis 7. Akce při odpojení od serveru

Procedure TForm1.IdTCPClient1Disconnected(Sender: TObject); begin txtServer.Enabled:= True; cmbConnect.Caption:= "Připojit"; Timer1.Enabled:= False; konec;

Nejobtížnější částí klientské aplikace je zpracování dat odesílaných serverem. Klientská aplikace požaduje data časovače a zpracuje přijatá data, jak je uvedeno ve výpisu 8.

Procedure TForm1.Timer1Timer(Sender: TObject); var stream: TMemoryStream; begin //požaduje data ze serveru o sledovaném počítači pomocí (IdTCPClient1) do begin //...oprávnění WriteLn("get_screen_width"); WriteLn("get_screen_height"); lblResolution.Caption:= IntToStr(ReadInteger) + "x" + IntToStr(ReadInteger); //...hloubka barev WriteLn("get_screen_colors"); lblColors.Caption:= IntToStr(ReadInteger); //...kopírování obrazovky //.....1. možnost - kopírování obrazovky bez komprese //WriteLn("get_screen"); //.....2. možnost - komprese na straně serveru WriteLn("get_screen:" + IntToStr(imgScreen.Width) + "," + IntToStr(imgScreen.Height)); //....získání datového proudu:= TMemoryStream.Create; ReadStream(stream); stream.Position:= 0; //....vytvořte obrázek imgScreen.Picture.Bitmap.LoadFromStream(stream); proud.Jasný; stream.Free; konec; konec;

V textu výpisu 8 je spousta komentářů, takže nemá smysl to dále vysvětlovat. Zastavme se u toho, proč procedura TForm1.Timer1Timer poskytuje dvě možnosti pro příjem obrazu ze serveru.

Jde o to, že komprese (v našem příkladu je rozlišení obrazovky monitorovaného počítače větší než velikost komponenty imgScreen) na straně serveru vyžaduje více času procesoru od počítače, na kterém běží serverová aplikace, aby pořídil kopii obrazovky. To snižuje zatížení sítě při přenosu obrázků a také šetří prostředky na klientském počítači. Ale kvalita komprimovaného obrazu je v tomto případě poněkud horší, než když komponentu poskytujeme obraz schopnost změnit měřítko obrazu sami.

Pokud na serveru nepoužijete kompresi obrazu, zatížení sítě se při přenosu kopie obrazovky v plné velikosti zvýší a veškerá práce na kompresi obrazu je přiřazena komponentě imgScreen (to znamená, že se plýtvá dalším časem procesoru na klientský počítač). Pokud je rozlišení obrazovky monitorovaného počítače vysoké (nebo při sledování více počítačů najednou), může se klientský stroj, pokud není dostatečně výkonný, začít poměrně znatelně „zpomalovat“. Kvalita komprimovaného obrazu je vyšší.

Jako více či méně efektivní řešení lze navrhnout použití velkých časových úseků mezi požadavky na data ze sledovacího serveru se změnou měřítka obrazu na straně serveru (pokud serverový stroj nemá velmi nízkou spotřebu).

Zdroj . Vyrobeno na Delphi 7.

Úvod

Tento článek je věnován vytváření aplikací architektury klient/server v Borland Delphi založených na soketech („sockety“ - hnízda). Na rozdíl od předchozího článku na téma sockety se zde podíváme na tvorbu serverových aplikací.

Ihned je třeba poznamenat, že pro koexistenci samostatných klientských a serverových aplikací není nutné mít několik počítačů. Stačí mít jen jeden, na kterém můžete současně provozovat server i klienta. V tomto případě musíte jako název počítače, ke kterému se chcete připojit, použít název hostitele localhost nebo IP adresa - 127.0.0.1 .

Začněme tedy teorií. Pokud jste přesvědčený praktik (a nevidíte žádné algoritmy očima), měli byste tuto část přeskočit.

Algoritmus provozu soketového serveru

Co vám soketový server umožňuje?.. Na jakém principu funguje?.. Server založený na soketovém protokolu umožňuje obsluhovat mnoho klientů najednou. Navíc si můžete sami určit limit jejich počtu (nebo tento limit úplně odstranit, jak je standardně provedeno). Pro každého připojeného klienta server otevře samostatný soket, jehož prostřednictvím si můžete vyměňovat data s klientem. Dalším skvělým řešením je vytvoření samostatného procesu (Thread) pro každé připojení.

Podívejme se na diagram podrobněji:

  • Definice vlastností Port a ServerType - aby se klienti mohli normálně připojit k serveru, je nutné, aby port používaný serverem přesně odpovídal portu používanému klientem (a naopak). Vlastnost ServerType určuje typ připojení (další podrobnosti viz níže);
  • Otevření zásuvky - otevření zásuvky a zadaného portu. Zde automaticky začneme čekat na připojení klientů ( Poslouchat);
  • Připojení klienta a výměna dat s ním - zde se klient připojuje a vyměňuje si s ním data. Více o této fázi se dozvíte níže v tomto článku a v článku o socketech (klientská část);
  • Deaktivace klienta - Zde se klient odpojí a jeho soketové spojení se serverem je uzavřeno;
  • Zavření serveru a soketu - Na příkaz administrátora se server vypne, uzavře všechny otevřené soketové kanály a přestane čekat na připojení klientů.

Nutno podotknout, že body 3-4 se mnohokrát opakují, tzn. Tyto kroky se provádějí pro každé nové připojení klienta.

Poznámka : V Delphi je v současné době velmi málo dokumentace k socketům, takže pokud chcete toto téma prostudovat co nejhlouběji, doporučuji vám prostudovat si literaturu a elektronickou dokumentaci o systémech Unix/Linux – tam Velmi Teorie práce se zásuvkami je dobře popsána. Kromě toho existuje mnoho příkladů soketových aplikací pro tyto operační systémy (ačkoli většinou v C/C++ a Perlu).

Stručný popis komponenty TServerSocket

Zde se seznámíme s hlavní vlastnosti, metody a události komponenty TServerSocket.

Vlastnosti Metody Události
Zásuvka - třída TServerWinSocket, prostřednictvím které máte přístup k otevřeným soketovým kanálům. Dále se budeme touto vlastností zabývat podrobněji, protože je ve skutečnosti jedním z hlavních. Typ: TServerWinSocket ;
ServerType - typ serveru. Může nabývat jedné ze dvou hodnot: stNonBlocking- synchronní práce s klientskými sokety. S tímto typem serveru můžete pracovat s klienty prostřednictvím událostí OnClientRead A OnClientWrite. stThreadBlocking- asynchronní typ. Pro každý klientský soketový kanál je vytvořen samostatný proces (vlákno). Typ: TServerType ;
ThreadCacheSize - počet klientských procesů (vlákno), které budou ukládány do mezipaměti serveru. Zde musíte vybrat průměrnou hodnotu v závislosti na zatížení vašeho serveru. Ke ukládání do mezipaměti dochází proto, aby se pokaždé nevytvářel samostatný proces a nezabil uzavřený soket, ale aby byly ponechány pro pozdější použití. Typ: Celé číslo ;
Aktivní - indikátor, zda je server v daný okamžik aktivní nebo ne. To je ve skutečnosti hodnota Skutečný označuje, že server běží a je připraven přijímat klienty a Nepravdivé- server je vypnutý. Chcete-li spustit server, musíte tuto vlastnost jednoduše nastavit na Skutečný. Typ: Boolean ;
Přístav - číslo portu pro navazování spojení s klienty. Porty serveru a klienta musí být stejné. Doporučují se hodnoty od 1025 do 65535, protože od 1 do 1024 - může být obsazeno systémem. Typ: Celé číslo ;
Servis - řetězec definující službu ( ftp, http, pop, atd.), jehož port bude použit. Jedná se o jakýsi adresář čísel portů odpovídajících různým standardním protokolům. Typ: tětiva ;
OTEVŘENO - Spustí server. Tento příkaz je v podstatě identický s přiřazením hodnoty Skutečný vlastnictví Aktivní;
Zavřít - Zastaví server. Tento příkaz je v podstatě identický s přiřazením hodnoty Nepravdivé vlastnictví Aktivní.
OnClientConnect - dochází, když klient navázal soketové připojení a čeká na odpověď ze serveru ( OnAccept);
OnClientDisconnect - Nastane, když se klient odpojí od soketového kanálu;
OnClientError - nastane, když aktuální operace selže, tzn. Došlo k chybě;
OnClientRead - nastane, když klient předá serveru nějaká data. K těmto datům lze přistupovat prostřednictvím parametru passable Socket: TCustomWinSocket;
OnClientWrite - nastává, když server může odesílat data klientovi přes soket;
OnGetSocket - v handleru této události můžete upravit parametr ClientSocket;
OnGetThread - v handleru této události můžete definovat jedinečný proces (Thread) pro každý jednotlivý klientský kanál přiřazením parametru SocketThread požadovaný dílčí úkol TServerClientThread;
OnThreadStart , OnThreadEnd - nastane, když je spuštěn nebo zastaven dílčí úkol (proces, vlákno);
OnAccept - nastane, když server přijme klienta nebo mu odmítne spojení;
OnListen - nastane, když server přejde do režimu čekání na připojení klientů.

TServerSocket.Socket(TSServerWinSocket)

Jak tedy může server odesílat data klientovi? A co příjem dat? Hlavně pokud pracujete přes události OnClientRead A OnClientWrite, pak můžete komunikovat s klientem prostřednictvím parametru ClientSocket (TCustomWinSocket). O práci s touto třídou si můžete přečíst v článku o klientských soketech, protože odesílání/odesílání dat přes tuto třídu je podobné - metody (Send/Receive)(Text,Buffer,Stream). Totéž platí při práci s TServerSocket.Socket. Nicméně, protože Zde uvažujeme o serveru, měli bychom zdůraznit některé užitečné vlastnosti a metody:

  • Aktivní připojení (Celé číslo) - počet připojených klientů;
  • ActiveThreads (Celé číslo) - počet běžících procesů; Spojení (pole) - pole sestávající ze samostatných tříd TClientWinSocket pro každého připojeného klienta. Například tento příkaz:
    ServerSocket1.Socket.Connections.SendText("Ahoj!");
    odešle zprávu „Ahoj“ prvnímu připojenému klientovi. Příkazy pro práci s prvky tohoto pole - také (Send/Receive)(Text,Buffer, Stream);
  • IdleThreads (Celé číslo) - počet volných procesů. Tyto procesy jsou ukládány do mezipaměti serveru (viz ThreadCacheSize);
  • LocalAddress, LocalHost, LocalPort- respektive - místní IP adresa, název hostitele, port;
  • RemoteAddress, RemoteHost, RemotePort- respektive - vzdálená IP adresa, název hostitele, port;
  • Metody Zámek A Odemknout- respektive blokování a odblokování zásuvky.

Praxe a příklady

Nyní se podívejme na výše uvedené na konkrétním příkladu. Hotové zdroje si můžete stáhnout kliknutím.

Podívejme se tedy na velmi dobrý příklad práce s TServerSocket (tento příklad je nejnázornější pomůckou pro studium této komponenty). Níže uvedené zdroje demonstrují protokolování všech důležitých událostí serveru a navíc možnost přijímat a odesílat textové zprávy:

Příklad 1 Logování a studium provozu serveru, odesílání/příjem zpráv přes sokety.

(...Zde je záhlaví souboru a definice formuláře TForm1 a jeho instance Form1) (Viz celý zdroj) procedure TForm1.Button1Click(Sender: TObject); začít (Určete port a spusťte server) ServerSocket1.Port:= 1025; (Metoda Insert vloží řetězec do pole na zadané pozici) Memo2.Lines.Insert(0,"Server se spouští"); ServerSocket1.Open; konec; procedure TForm1.Button2Click(Sender: TObject); začít (Zastavit server) ServerSocket1.Active:= False; Memo2.Lines.Insert(0,"Server zastaven"); konec; Memo2.Lines.Insert(0,"Poslouchání na portu "+IntToStr(ServerSocket1.Port)); konec; procedure TForm1.ServerSocket1Accept(Sender: TObject; Socket: TCustomWinSocket); začít (zde server přijímá klienta) Memo2.Lines.Insert(0,"Připojení klienta přijato"); konec; procedure TForm1.ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket); začít (zde se klient připojí) Memo2.Lines.Insert(0,"Klient připojen"); konec; procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); začít (Tady se klient odpojí) Memo2.Lines.Insert(0,"Klient odpojen"); konec; procedure TForm1.ServerSocket1ClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); začít (Došlo k chybě – zobrazte její kód) Memo2.Lines.Insert(0,"Chyba klienta. Kód = "+IntToStr(ErrorCode)); konec; procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); začít (Byla přijata zpráva od klienta - zobrazte ji v Memo1)< "+Edit1.Text); end;

Memo2.Lines.Insert(0,"Zpráva přijata od klienta"); Memo1.Lines.Insert(0,"> "+Socket.ReceiveText); konec;

procedure TForm1.ServerSocket1ClientWrite(Sender: TObject; Socket: TCustomWinSocket); začít

Jistě, pokud váš server bude obsluhovat mnoho klientů, budete muset uložit nějaké informace pro každého klienta (jméno atd.) a svázat tyto informace se soketem tohoto klienta. V některých případech není toto vše provádět ručně (navázání na úchyt soketu, klientská pole atd.) příliš pohodlné. Proto pro každou zásuvku existuje speciální vlastnost - Data. Ve skutečnosti je Data jen ukazatel. Proto při zápisu klientských dat do této vlastnosti buďte opatrní a dodržujte pravidla práce s ukazateli (alokace paměti, definice typu atd.)!

Odesílání souborů přes socket.

Zde se podíváme na odesílání souborů přes socket (na žádost JINX) :-). Jak tedy odeslat soubor přes soket? Velmi jednoduché! Vše, co musíte udělat, je otevřít tento soubor jako souborový stream (TFileStream) a odeslat jej přes soket (SendStream)! Podívejme se na to na příkladu:

Je třeba poznamenat, že metoda SendStream používá nejen server, ale také klient ( ClientSocket1.Socket.SendStream(srcfile))

Proč lze během přenosu spojit několik bloků do jednoho?

To je také na přání JINX :-). Za to mu patří velký dík! Nejprve je tedy třeba poznamenat, že data odeslaná přes socket lze nejen sloučit do jednoho bloku, ale také rozdělit do několika bloků. Faktem je, že socket je běžný stream, ale na rozdíl třeba od souborového streamu (TFileStream) přenáší data pomaleji (rozuměj - síť, omezený provoz atd.). Proto dva příkazy:
ServerSocket1.Socket.Connections.SendText("Dobrý den, ");
ServerSocket1.Socket.Connections.SendText("svět!");
zcela identické s jedním příkazem:
ServerSocket1.Socket.Connections.SendText("Ahoj, světe!");

A to je důvod, proč, pokud odešlete soubor řekněme 100 KB přes socket, pak osoba, které jste tento blok poslali, obdrží několik bloků o velikostech, které závisí na provozu a přetížení linky. Navíc velikosti nemusí být nutně stejné. Z toho vyplývá, že pro přijetí souboru nebo jakýchkoli jiných velkých dat byste měli přijmout bloky dat a ty pak spojit do jednoho celku (a uložit např. do souboru). Vynikajícím řešením tohoto problému je stejný souborový stream - TFileStream (nebo stream v paměti - TMemoryStream). Prostřednictvím události OnRead (OnClientRead) můžete přijímat kousky dat ze soketu pomocí univerzální metody ReceiveBuf. Pomocí metody můžete určit velikost výsledného bloku ReceiveLength. Můžete také použít soketový stream (viz článek o TClientSocket). A zde je malý příklad (přibližný):

Jak monitorovat zásuvku

Tato problematika je složitá a vyžaduje dlouhé zvážení. Prozatím jen poznamenám, že vždy můžete sledovat zásuvku vytvořenou vaším programem :-). Sokety (jako většina objektů ve Windows) mají svůj vlastní popisovač zapsaný ve vlastnosti Handle. Jakmile tedy rozpoznáte tento deskriptor, budete moci volně spravovat jakýkoli soket (dokonce i ten, který vytvořil cizí program)! S největší pravděpodobností však pro sledování soketu někoho jiného budete muset používat výhradně funkce WinAPI Sockets.

Epilog

Tento článek ukazuje základní techniky pro práci s komponentou TServerSocket v Delphi a několik obecných technik pro výměnu dat přes sokety. Pokud máte dotazy, pošlete mi je na e-mail: [e-mail chráněný], a ještě lépe - napište do konference tohoto webu (Delphi. Obecné otázky), aby ostatní uživatelé viděli vaši otázku a pokusili se na ni odpovědět!

Karikh Nikolay ( Nitro). Moskevská oblast, Žukovskij

Odeslat svou dobrou práci do znalostní báze je jednoduché. Použijte níže uvedený formulář

Studenti, postgraduální studenti, mladí vědci, kteří využívají znalostní základnu ve svém studiu a práci, vám budou velmi vděční.

Vloženo na http://www.allbest.ru/

TEST

Vývoj aplikace klient-server vDelphi

Přehled komponent

Pro práci s ADO je na záložce ADO komponent šest komponent: TADOConnection, TADOCommand, TADODataSet, TADOTable, TADOQuery, TADOStoredProc.

Rýže. 1. Paleta komponent ADO

TADOConnection slouží ke specifikaci databáze a práci s transakcemi.

TADOTable je tabulka přístupná přes ADO.

TADOQuery - dotaz do databáze. Může to být buď dotaz, který vrací data a databáze (například SELECT), nebo dotaz, který nevrací data (například INSERT).

TADOStoredProc - volání uložené procedury.

TADOCommand a TADODataSet jsou nejběžnější komponenty pro práci s ADO, ale také nejsložitější pro práci s nimi. Obě komponenty umožňují spouštět příkazy v jazyce poskytovatele dat (jak se v ADO nazývá ovladač databáze).

Rozdíl mezi nimi je v tom, že příkaz spouštěný přes TADODataSet musí vracet datovou sadu a tato komponenta s nimi umožňuje pracovat pomocí nástrojů Delphi (například navázání komponenty typu TDataSource). A komponenta TADOCommand umožňuje provádět příkazy, které nevracejí datovou sadu, ale nemají standardní nástroje Delphi pro následné použití vrácené datové sady.

Je zřejmé, že všechny komponenty musí komunikovat s databází. To se provádí dvěma způsoby, buď prostřednictvím komponenty TADOConnection nebo přímou specifikací databáze v jiných komponentách. Ostatní komponenty jsou vázány na TADOConnection pomocí vlastnosti Connection a na databázi přímo pomocí vlastnosti ConnectionString.

programování databázového algoritmu

Tabulka 1. Hlavní součásti karty ADO

název

Základní vlastnosti

Komentáře

Zodpovědnost za komunikaci s databází

ConnectionString

Obsahuje nastavení pro připojení k databázi.

slouží k určení, zda se má při připojování k databázi zobrazit dialogové okno pro zadání ID uživatele a hesla;

označuje aktivitu připojení: True znamená, že připojení je otevřené, False znamená uzavřeno;

Základní metody

Komentáře

používá se k zahájení nové transakce a vrací úroveň vnořených transakcí;

zavře aktuálně otevřené připojení

zapíše všechny změny provedené aktuální transakcí do databáze a ukončí ji

slouží k provádění dotazů nebo uložených procedur. Spustitelný příkaz je předán této metodě prostřednictvím parametru;

otevře připojení ke zdroji dat zadanému v ConnectionString

zahodí všechny změny provedené od posledního volání metody BeginTrans a ukončí transakci bez uložení změn.

Základní vlastnosti

Komentáře

TADOQuery Navrženo pro práci s dotazy

Navrženo pro práci s uloženými procedurami

Obsahuje název komponenty ADOConnection

Obsahuje název uložené procedury

Pracovní algoritmus

1. Vytvořte nový DataModule Vyberte položku nabídky File\New\DataModule. Říkáme mu DM.

Na DM hodíme komponenty ADOConnection, ADOQuery a tři ADOStoredProcedure. Jak to vypadá, viz obr. 2

Obr.2 Pohled DM

2. Nastavte vlastnosti součásti

ADOConnection - viz manuál.

Přejmenujte ADOQuery 1 na QVrash a napište dotaz do vlastnosti SQL:

Vyberte * z Vrash

Vlastnost Connection je ADOConnectionl.

Vytvořte statická pole pro QVrash.

Pro komponentu ADOStoredProcl nastavujeme následující vlastnosti

* Název - ASPInsVrash

* Připojení - ADOConnection 1

* Název procedury - MainInsert; 1

Pokud kliknete na vlastnost Parametry, zobrazí se vám parametry, které předáme proceduře.

Pro komponentu ADOStoredProc2 nastavte následující vlastnosti

* Název - ASPEdVrash

* Připojení - ADOConnectionl

* Název procedury - MainEdit; 1

Pro komponentu ADOStoredProc3 nastavte následující vlastnosti

* Název - ASPDelVrash

* Připojení - ADOConnectionl

* Název procedury - MainDelete; 1

Umístěte komponenty DBGrid, dvě tlačítka, DataSource, MainMenu na formulář 1

Obr. Formulář 1

Přejmenujte tlačítka podle obrázku

Pro tlačítko Aktualizovat kód

DM.QVrash.Close; //aktualizace n/a

Vytvoření jídelníčku

Rýže. 3. Nabídka Upravit

Vytvořte formulář pro přidání/editaci: Komponenty EDIT

Programový kódpro položku nabídkyna formuláři 1-DODATEK

Form3.Edit1.text:="";

Form3.Edit2.text:="";

Form3.Edit3.text:="";

Form3.Edit4.text:="";

Form3.showmodal;

Programový kód tlačítkana formuláři 3-VLOŽIT

Begin

showmessage("Ne všechna pole jsou vyplněna");

End;

Try

DM.ADOConnection1.BeginTrans;

s DM.ASPInsVrash udělat

Parameters.ParamByName("@ID_Lékař").Value:=StrToInt(Edit1.text);

Parameters.ParamByName("@YYYY`).Value:=Edit2.Text;

Parameters.ParamByName("@YYYY ").Value:=Edit3.Text;

Parameters.ParamByName("@YYYY ").Value:=Edit4.text;

DM. ASPInsVrash.ExecProc;

Except

DM. QVrash.Close;

DM. QVrash.Open;

Vloženo na http://www.allbest.ru/

Programový kód pro položku menu na formuláři 1 - EDIT

Begin//Editace

n:=DM. QVrash.XXXXX.Value;

DM. QVrash.Close;

DM. QVrash.Open;

DM. QVrash.Locate(XXXX,n,);

Form3.Label6.Caption:=IntToStr(DM.QVrash.XXXXXvalue);

Form3.Edit1.text:=inttostr(DM.QVrashYYYYYY.Value);

Form3.Edit2.text:=inttostr(DM.QVrashYYYYY.Value);

Form3.Edit3.text:=floattostr(DM.QVrashYYYYY.Value);

Form3.Edit4.text:=DateToStr(DM.QVrash.YYYY.Value);

Form3.Showmodal;

DM. QVrash.Close;

DM. QVrash.Open;

Programový kód pro tlačítko na formuláři 3 - EDIT

Begin

Pokud (Edit1.text="") nebo (Edit2.Text="")nebo (Edit3.Text="") nebo (Edit4.Text=""), pak

Begin

ShowMessage("Ne všechna pole jsou vyplněna");

End;

Try

DM.ADOConnection1.BeginTrans;

s DM.ASPEdVrash udělat

Parameters.ParamByName("@XXXX).Value:= DM.a QVrash.XXXXX.value;

Parameters.ParamByName("@YYYY).Value:=Edit1.text;

Parameters.ParamByName("@YYYYY).Value:=Edit2.Text;

Parameters.ParamByName("@YYYY").Value:=Edit3.Text;

Parameters.ParamByName("@YYYY).Value:=StrToDate(Edit4.text);

DM.ASPEd.ExecProc;

DM.ADOConnection1.CommitTrans;

Except

DM.ADOConnection1.RollbackTrans;

ShowMessage("Nelze dokončit. Zkuste to prosím znovu.");

DM. QVrash.Close;

Programový kód pro položku nabídky na formuláři 1 - DELETE

Začít// Smazat

if MessageDlg("Opravdu chcete smazat záznam?", mtConfirmation,,0)=mrYes then

DM.ASPDel.Parameters.ParamByName("@XXXX).Value:=DM.ADOQuery1XXXXX.Value;

Try

DM.ADOConnection1.BeginTrans;

DM.ASPDelVrash.ExecProc;

DM.ADOConnection1.CommitTrans;

Except

ShowMessage("Smazání se nezdařilo!"+#13+"Položka je zablokována nebo již byla smazána!");

DM.ADOConnection1.RollbackTrans;

Exit;

DM. QVrash.Close;

DM. QVrash.Open;

Publikováno na Allbest.ru

Podobné dokumenty

    Vývoj administrativního manažerského informačního systému. Výběr programovacího jazyka a prostředí. Struktura informační interakce. Požadavky na softwarové a hardwarové prostředí. Vytvoření programu v Delphi a jeho propojení s databází.

    práce v kurzu, přidáno 10.8.2015

    Borland Delphi 7 jako univerzální vývojový nástroj používaný v mnoha oblastech programování, funkce: přidávání informací o uchazečích do databáze, generování reportů. Přehled a charakteristika hlavních komponent Delphi.

    test, přidáno 18.10.2012

    Vývoj softwaru pro práci s informacemi a jejich zpracování v programovacím jazyce Delphi. Popis algoritmů pro práci se zásobníkem - přidávání, mazání prvků, editace záznamu. Pokyny pro použití programu.

    práce v kurzu, přidáno 02.06.2013

    Zvážení vlastností programovacího prostředí Delphi, analýza klient-server verze. Úvod do knihovny vizuálních komponent. Základní funkce inteligentního editoru. Charakteristika požadavků na databázi. Funkce magisterského programu.

    práce, přidáno 3.10.2013

    Charakteristika programovacího systému. Hlavní součásti Delphi. Rozhraní softwarové aplikace. Výsledky programu. Příručka systémového programátora a operátora. Programovací jazyk Delphi, prostředí kompilátoru Borland 7.0.

    práce v kurzu, přidáno 29.05.2013

    Psaní programu pro práci s klienty pomocí jazyka Delphi, který umožňuje zadávání, editaci a mazání informací. Vývoj algoritmu pro řešení problému, popis proměnných, pomocné procedury, vstupní a výstupní data.

    práce v kurzu, přidáno 21.09.2010

    Obecná charakteristika programovacího systému Delphi a také principy tvorby jeho komponent. Popis hodnot souboru aplikace vytvořené pomocí Delphi. Struktura a vlastnosti Visual Component Library (VCL).

    zpráva z praxe, přidáno 12.7.2010

    Návrh a tvorba uživatelského rozhraní a vizuálního programování v prostředí Delphi. Systém pro správu databází. Místní a globální uživatelské pohledy. Analýza domény. Účel forem a komponent.

    práce v kurzu, přidáno 03.07.2014

    Historie integrovaného vývojového prostředí, verze Delphi. Organizace knihovny komponent. Dodatečná stránka, řada běžně používaných komponent pro všeobecné použití. Spustitelný soubor programu "Text File Archiver", rozhraní aplikace.

    práce v kurzu, přidáno 16.05.2017

    Vývoj softwarových produktů v programovacím jazyce Borland Delphi. Použité tabulky a vztahy mezi nimi. Uživatelské rozhraní pro práci s databází. Algoritmus pro program "Fotbalové týmy a hráči". Ochrana před nesprávným zadáním dat.




Horní