Andmebaasi loomine. Lihtsa klient-serveri rakenduse loomine Delphis

Selles õpetuses näitan teile, kuidas saate luua erinevaid võrgurakendused Delphis, kasutades komponente TServerSocket ja TClientSocket. See õppetund aitab teil oma programme arendada või arvutimängud, mis saavad suhelda kohalike või Interneti-võrkude kaudu.

Esmalt leiame üles vajalikud TServerSocketi ja TClientSocketi komponendid. Enamasti ei kuulu need standardse Delphi installipaketi hulka, kuid neid saab täiendavalt installida. Selleks käivitage Delphi, minge jaotisse "Komponent/Install paketid", seejärel klõpsake nuppu "Lisa". Avanevas dialoogiboksis peate leidma faili “dclsocketsXX.bpl” (see asub prügikasti kaust, mis asub Delphi kaustas), kus XX on teie Delphi numbriline versiooninumber. Leidke fail, klõpsake nuppu "Ava" ja seejärel klõpsake aknas "Install Packages" nuppu "OK".

Nüüd on vahekaardil „Internet” ilmunud kaks komponenti - TServerSocket ja TClientSocket, millega käsitleme selles õppetükis töötamist.

Komponentide endi nimede põhjal pole raske arvata, et TClientSocket komponent mängib võrgus kliendi rolli, mis ühendub serveriga TServerSocket komponendiga.

Käesolevas artiklis käsitleme serverina serveri rolli, mis täidab serveri rolli, ja kliente, mida nimetame serveriga ühenduse loovateks klientprogrammideks.

Server teenindab tavaliselt klientide vahelist võrgu suhtlust. Seega saab klient saata mis tahes teavet serverisse ja server saadab selle teabe teistele klientidele.

Vaatame, kuidas veebivestlus töötab. Oletame, et vestlusserveriga on ühendatud mitu klienti. Üks klientidest saadab serverile uue sõnumi. Server võtab sõnumi vastu ja saadab selle ülejäänud klientidele tagasi. Ülejäänud kliendid saavad sõnumi serverist ja nii edastatakse vestlussõnumid.

Selliseid võrgurakendusi, mis hõlmavad klienti ja serverit, nimetatakse klient-server rakendusteks.

Nüüd proovime välja mõelda, kuidas nende komponentidega töötada. Proovime rakendada sarnast kliendi-serveri vestlust.

Kõigepealt loome serveri, mis peaks sõnumi vastu võtma ja selle kõigile klientidele tagasi saatma.

Loome Delphis uue rakenduse, asetame sellele komponendi TServerSocket ja määrame selle parameetrites järgmised väärtused:

Aktiivne = vale
Nimi = srv
Port = 22500
Serveri tüüp = stNonBlocking

Aktiivne parameeter vastutab serveri oleku eest, olenemata sellest, kas see on aktiivne või mitteaktiivne. hetkel.

IN OnCreate sündmusära unusta vormile lisada srv.active:=true, et server käivituks.

Parameetris Port peate määrama pordi, mille kaudu edastatakse teabega paketid kliendilt serverisse ja tagasi.

Samuti paneme vormile (nimetagem seda logiks) komponendi Memo1, mida vajame vestluse toimimise jälgimiseks.

Nüüd loome srv jaoks sündmuse onClientConnect, millesse saame salvestada kliendiühendused serveriga. Sündmuse enda koodi kirjutame:

protseduur TForm1.srvClientConnect(Saatja: TObject;
Pistikupesa: TCustomWinSocket);
alustada
log.Lines.Add(’IP-aadressiga ühendatud klient ‘+Socket.RemoteAddress);
lõpp;

Nii saame teada serveriga ühenduse loova kliendi IP-aadressi.

Sündmuse muutuja Socket salvestab kogu vajaliku teabe serveriga ühenduse loonud kliendi kohta.

Sündmuste töötlejat onClientRead kasutatakse kliendilt saadud teabe vastuvõtmiseks ja töötlemiseks. Vaatame näidet:

protseduur TForm1.srvClientRead(Saatja: TObject; Socket: TCustomWinSocket);
var
str:string;
i:täisarv;
alustada
str:=Socket.ReceiveText;
log.Lines.Add(str);
i:= 0 jaoks srv.Socket.ActiveConnections -1 teha
srv.Socket.Connections[i].SendText(str);
lõpp;

Määrame muutujale str kliendilt saadud tekstisõnumi väärtuse ja lisame saadud sõnumi logisse. Pärast seda saadame kõigile klientidele sõnumi. Ühendatud klientide arvu leiate jaotisest srv.Socket.ActiveConnections.

Oletame, et kui tahame saata sõnumi konkreetsele kliendile, saab seda teha järgmiselt:

srv.Socket.Connections[a].SendText(‘testisõnum’);

Sel juhul on muutuja a srv.Socket.Connections numbriline identifikaator. Need ID-d on vahemikus 0 kuni srv.Socket.ActiveConnections -1. Aga kuidas saame näiteks kliendile saata sõnumi kindla IP-aadressiga, mida me ette teame? Seda tehakse järgmiselt:

i:= 0 jaoks srv.Socket.ActiveConnections -1 teha
if srv.Socket.Connections[i].RemoteAddress= ‘123.123.123.123’, siis alusta
srv.Socket.Connections[i].SendText(‘testisõnum’);
murda;
lõpp;

Kordame kõiki serveri ühendusi. Kui kliendi IP-aadress ühtib “123.123.123.123” (võib olla ka muu), saadame sellele kliendile sõnumi ja lõpetame tsükli.

Ja lõpuks, kaalume veel üht TServerSocketi sündmust – onClientDisconnect, mis käsitleb kliendi serverist lahtiühendamist.

procedúra TForm1.srvClientDisconnect(Saatja: TObject;
Pistikupesa: TCustomWinSocket);
alustada
log.Lines.Add('Klient '+socket.RemoteAddress+' on serveriga lahti ühendatud.');
lõpp;

Liigume nüüd edasi kliendi juurde. Loome midagi uut Delphi rakendus ja asetage sellesse komponent TClientSocket ja andke sellele komponendile nimi "klient". Määrame kliendikomponendi parameetritele järgmised väärtused:

Aktiivne = vale
Port = 25500
ClientType = ctNonBlocking
Aadress = 127.0.0.1

Aadressi parameetris määrake selle arvuti IP-aadress, milles töötate serverirakendus. Kui loote ühenduse IP-aadressiga 127.0.0.1, loob arvuti jämedalt öeldes ühenduse iseendaga ja töötab serveriprogramm, mis käivitatakse samas kohas, kus käivitatakse klient. See meetod on võrgurakenduste testimiseks väga mugav.

Kliendi pordi väärtus peab olema sama, mis serveri jaoks!

Samuti lisame serverilt saadud sõnumite kuvamiseks TMemo komponendi nimega logi.

Vaatleme selle vormi parameetrit OnCreate, kus serveriga ühendus luuakse.

protseduur TForm1.FormCreate(Saatja: TObject);
alustada
(Üritan ühendust luua)
ClientSocket1.Open;
lõpp;

Nüüd paneme kliendivormile nupu Button1 ja üherealise Edit1 tekstivälja. Vajame neid serverisse sõnumite saatmiseks. Kirjutage komponendi Button1 sündmusele OnClick:

Client.Socket.SendText(Redigeeri1.Tekst);

Nii saadetakse Edit1 sisestatud sõnum serverisse.

Pärast sõnumi saatmist serverisse saadab server sõnumi kõigile klientidele, seega peate selle serverilt vastu võtma. Selleks vajame OnReadi sündmust:

protseduur ClientRead(Saatja: TObject; Socket: TCustomWinSocket);
alustada
(Kui teade on saabunud, lisage see logisse)
Log.Lines.Add(Socket.ReceiveText);
lõpp;

Jääb vaid kirjutada serverist ühenduse katkestamise sündmus. Selleks saame luua teise nupu ja määrata selle OnClick sündmuses

Klient.sulge;

Käivitage klient ja server. Proovige saata sõnum serverile, server peaks selle teile vastuseks tagastama. Kui ilmneb tõrge "Asynchronous socket error 10061", on see tõenäoliselt tingitud sellest, et server pole saadaval. Kontrollige portide, IP-aadresside vastavust ja võrguühenduse funktsionaalsust.

Tänaseks jääb väga aktuaalne teema infotehnoloogia valdkonnas, mis on pühendatud klient-server arhitektuuri arendamisele ja juurutamisele. See on tingitud asjaolust, et infosüsteemid erinevad kaalud leida kõike suurem rakendus erinevates valdkondades. Lisaks luuakse iga andmebaasi struktuur teatud parameetrite järgi ja nii, et sellega töötamine on tavaline režiim võimalik ainult kasutamisel spetsiaalsed rakendused. Seetõttu on klient-server arhitektuuri rakendamine väga oluline ülesanne erinevate objektide infotehnoloogiaosakondade ees kerkiv probleem, mille edukas lahendamine võimaldab ettevõttel optimaalselt ja katkematult toimida.

Pistikupesapõhine server

Socket-protokollil töötav server võimaldab teil samaaegselt töödelda päringuid suur kogus kasutajad. Samal ajal saab administraator igal ajal seadistusi muuta, et piirata samaaegselt teenindatavate kasutajate arvu. Vaikimisi pole sellel sättel piiranguid.

Kui klient on serveriga ühenduse loonud, avaneb see eraldi kanal pistikupesaga, mille kaudu andmeid vahetatakse. Kõige optimaalsem ja ohutum viis on aga juurutada iga uue ühenduse jaoks spetsiaalne eraldi protsess.

Arhitektuuri "Klient – ​​server" tööskeem

Vaatame lähemalt arhitektuuri rakendusskeemi, analüüsides järjestikku sageli kasutatavaid määratlusi:

1. Serveri tüüp ja pordi omadused. Selleks, et kasutaja saaks serveriga ühenduse luua, on oluline jälgida, et nii serveri kui ka kliendi kasutatav port oleks sama. Selle parameetri eesmärk on tehtud Port atribuudis. Ühenduse tüüp määratakse parameetri ServerType järgi.

2. Pistikupesa avamise protsess. Kliendi-serveri seansi alustamiseks on oluline avada pesa ja port. Kasutatakse atribuuti Kuula.

3. Järgmisena vahetatakse andmeid kasutajaga. Kui töö on lõpetatud, katkestab klient ühenduse. Vajadusel lülitub server välja, katkestades kõik loodud ühendused ja peatades uute ühenduste ootamise.

TServerSocketi kasutamine Delphi kliendi-serveri rakendustes

OnClientWrite ja OnClientRead sündmusi kasutatakse kasutajalt teabe saatmiseks ja vastuvõtmiseks. Sel juhul saate kasutajaga suhelda parameetri, näiteks ClientSocket, kaudu. Kasutatakse sageli tööl järgmisi meetodeid ja omadused:

Hetkel ühendatud kasutajate arv;

Number aktiivsed protsessid;

Tasuta protsesside arv;

Port, hostinimi ja kohalik IP-aadress;

Pistikupesa blokeeringust vabastamine ja blokeerimine.

Kokkuvõtteks pöörame tähelepanu sageli kasutatavale eriomadusele - Data. Seda kinnisvara kasutatakse järgmine olukord. Reeglina kasutatakse serverit suure hulga kasutajate teenindamiseks, mis tähendab, et iga kliendi kohta on vaja salvestada teavet ja see teave peab olema seotud konkreetse pesaga. Sellistes olukordades on käsitsi sidumise kasutamine väga ebamugav ja seetõttu kasutatakse atribuuti Data laialdaselt. Siiski on oluline meeles pidada, et Data on osuti ja seetõttu on oluline kontrollida, kas kõik osutitega töötamise reeglid (tüübi spetsifikatsioon, mälu eraldamine jne) on täidetud.

Dokumentatsioon

Delphi klient-server rakenduste arendamise kohta, mis on seotud pistikupesade arendamise ja kasutamisega, on siiani väga vähe kirjandust. Seetõttu võite selle aspekti üksikasjalikuks uurimiseks vaadata Linuxi ja Unixi süsteemide dokumentatsiooni, kuna see käsitleb üksikasjalikult pesade abil rakenduste juurutamise tehnoloogiat, kuid reeglina Perlis või C++.

Sissejuhatus

See artikkel on pühendatud kliendi/serveri arhitektuurirakenduste loomisele Borland Delphis, mis põhinevad pesadel ("sockets" - pesad). Erinevalt eelmisest pistikupesade teemast käsitlevast artiklist vaatleme siin serverirakenduste loomist.

Kohe tuleb märkida, et kooselu jaoks üksikud rakendused kliendil ja serveril ei pea olema mitut arvutit. Piisab, kui teil on ainult üks, millel saate samaaegselt käivitada nii serveri kui ka kliendi. Sel juhul peate kasutama hostinime selle arvuti nimena, millega soovite ühenduse luua kohalik host 127.0.0.1 .

või IP-aadress -

Niisiis, alustame teooriaga. Kui olete veendunud praktik (ega ei näe oma silmaga ühtegi algoritmi), peaksite selle jaotise vahele jätma.

Socket serveri tööalgoritm

Mida socket-server võimaldab teha?.. Mis põhimõttel see töötab?.. Socket-protokollil põhinev server võimaldab teenindada palju kliente korraga. Lisaks saate ise määrata nende arvu piirangu (või selle piirangu üldse eemaldada, nagu vaikimisi tehakse). Iga ühendatud kliendi jaoks avab server eraldi pistikupesa, mille kaudu saate kliendiga andmeid vahetada.

  • Teine suurepärane lahendus on luua iga ühenduse jaoks eraldi protsess (Thread). - selleks, et kliendid saaksid normaalselt serveriga ühenduse luua, on vaja, et serveri kasutatav port vastaks täpselt kliendi poolt kasutatavale pordile (ja vastupidi).
  • Atribuut ServerType määrab ühenduse tüübi (vt täpsemalt allpool); Pistikupesa avamine - pistikupesa ja määratud pordi avamine.);
  • Siin hakkame automaatselt ootama, kuni kliendid ühenduse loovad ( Kuulake
  • Kliendi ühendamine ja sellega andmete vahetamine - siin loob klient sellega ühenduse ja vahetab andmeid. Selle etapi kohta saate lisateavet allpool käesolevas artiklis ja pistikupesasid käsitlevas artiklis (kliendiosa);
  • Kliendi keelamine - Siin katkestab klient ühenduse ja tema pesaühendus serveriga suletakse;

Serveri ja pistikupesa sulgemine

- Administraatori käsul lülitub server välja, sulgedes kõik avatud pesakanalid ja lõpetades kliendiühenduste ootamise. Tuleb märkida, et punkte 3-4 korratakse mitu korda, s.t. Need sammud tehakse iga uue kliendiühenduse jaoks. Märkus: Delfis on praegu väga vähe dokumentatsiooni pistikupesade kohta, nii et kui soovite seda teemat võimalikult põhjalikult uurida, soovitan teil tutvuda kirjanduse ja elektroonilise dokumentatsiooniga Unixi/Linuxi süsteemide kohta - seal

Väga

Pistikupesadega töötamise teooria on hästi kirjeldatud. Lisaks on nende OS-ide jaoks palju näiteid soklirakendustest (kuigi enamasti C/C++ ja Perl). TServerSocketi komponendi lühikirjeldus Siin me tutvume peamine.

komponendi omadused, meetodid ja sündmused TServerSocket Omadused
meetodid Sündmused Pistikupesa - klass TServerWinSocket, mille kaudu on teil juurdepääs avatud soklikanalitele. Järgmisena käsitleme seda vara üksikasjalikumalt, kuna see on tegelikult üks peamisi. ;
Tüüp: TServerWinSocket Serveri tüüp - - serveri tüüp. Võib võtta ühe kahest väärtusest: stNonBlocking sünkroonne töö kliendi pistikupesadega. Seda tüüpi serveriga saate klientidega ürituste kaudu koostööd teha OnClientRead. Ja OnClientWrite Pistikupesa stThreadBlocking ;
- asünkroonne tüüp. Iga kliendi soklikanali jaoks luuakse eraldi protsess (Thread). TServerType Pistikupesa ThreadCacheSize ;
- serveri vahemällu salvestatavate kliendiprotsesside (lõime) arv. Siin peate valima keskmise väärtuse sõltuvalt teie serveri koormusest. Vahemällu salvestamine toimub selleks, et mitte luua iga kord eraldi protsessi ja mitte tappa suletud pesa, vaid jätta need hilisemaks kasutamiseks. - indikaator selle kohta, kas server on antud hetkel aktiivne või mitte. See on tegelikult väärtus Tõsi näitab, et server töötab ja on klientide vastuvõtmiseks valmis, ja Vale- server on välja lülitatud. Serveri käivitamiseks peate selle atribuudi lihtsalt määrama Tõsi. Pistikupesa Boolean ;
Port - pordi number klientidega ühenduste loomiseks. Serveri ja kliendi pordid peavad olema samad. Soovitatavad väärtused 1025 kuni 65535, kuna 1 kuni 1024 - süsteem võib olla hõivatud. Pistikupesa ThreadCacheSize ;
Teenindus - teenust määratlev string ( ftp, http, pop jne), kelle porti kasutatakse. See on omamoodi pordinumbrite kataloog, mis vastab erinevatele standardprotokollidele. Tüüp: string ;
Avatud - Käivitab serveri. Põhimõtteliselt on see käsk identne väärtuse määramisega Tõsi vara - serveri vahemällu salvestatavate kliendiprotsesside (lõime) arv. Siin peate valima keskmise väärtuse sõltuvalt teie serveri koormusest. Vahemällu salvestamine toimub selleks, et mitte luua iga kord eraldi protsessi ja mitte tappa suletud pesa, vaid jätta need hilisemaks kasutamiseks.;
Sule - Peatab serveri. Põhimõtteliselt on see käsk identne väärtuse määramisega Vale vara - serveri vahemällu salvestatavate kliendiprotsesside (lõime) arv. Siin peate valima keskmise väärtuse sõltuvalt teie serveri koormusest. Vahemällu salvestamine toimub selleks, et mitte luua iga kord eraldi protsessi ja mitte tappa suletud pesa, vaid jätta need hilisemaks kasutamiseks..
OnClientConnect - tekib siis, kui klient on loonud sokliühenduse ja ootab vastust serverilt ( OnAccept);
OnClientDisconnect - Tekib, kui klient on pesakanalist lahti ühendanud;
OnClientError - tekib siis, kui praegune toiming ebaõnnestub, st.
sünkroonne töö tekkis viga; - tekib siis, kui klient on serverisse edastanud mõned andmed. Nendele andmetele pääseb juurde läbipääsetava parameetri kaudu;
OnClientRead Pistikupesa: TCustomWinSocket
- tekib siis, kui server saab pesa kaudu kliendile andmeid saata; OnGetSocket - selle sündmuse käitlejas saate parameetrit muuta;
ClientSocket OnGetThread - selle sündmuse käitlejas saab määrata iga üksiku kliendikanali jaoks unikaalse protsessi (Thread), määrates parameetri SocketThread
soovitud alamülesanne TServerClientThread; , OnThreadStart OnThreadEnd
OnAccept - tekib alamülesande (protsessi, lõime) käivitamisel või vastavalt peatamisel;
- tekib siis, kui server võtab kliendi vastu või keeldub talle ühenduse loomisest; Kuulake

- tekib siis, kui server läheb ooterežiimi, et kliendid saaksid ühenduse luua.

TServerSocket.Socket(TSServerWinSocket) sünkroonne töö Niisiis, kuidas saab server kliendile andmeid saata? Aga andmete vastuvõtmine? OnClientRead, siis saate kliendiga suhelda parameetri ClientSocket (TCustomWinSocket) kaudu. Selle klassiga töötamise kohta saate lugeda artiklist kliendipistikupesade kohta, kuna Andmete saatmine/saatmine läbi selle klassi on sarnane – meetodid (Saada/Vastu)(Tekst,Puhver,Stream). Sama kehtib ka TServerSocket.Socketiga töötamisel. Siiski, kuna Siin kaalume serverit, peaksime esile tõstma mõned kasulikud omadused ja meetodid:

  • ActiveConnections (ThreadCacheSize) - ühendatud klientide arv;
  • ActiveTreads (Täisarv) - jooksvate protsesside arv; Ühendused (massiivi) - massiiv, mis koosneb iga ühendatud kliendi jaoks eraldi klassidest TClientWinSocket. Näiteks see käsk:
    ServerSocket1.Socket.Connections.SendText("Tere!");
    saadab esimesele ühendatud kliendile sõnumi "Tere!" Käsud selle massiivi elementidega töötamiseks – ka (Saada/Vastu)(tekst,puhver, voog);
  • IdleThreads (ThreadCacheSize) - tasuta protsesside arv. Sellised protsessid salvestab server vahemällu (vt - asünkroonne tüüp. Iga kliendi soklikanali jaoks luuakse eraldi protsess (Thread).);
  • Kohalik aadress, LocalHost, LocalPort- vastavalt - kohalik IP-aadress, hostinimi, port;
  • RemoteAddress, RemoteHost, RemotePort- vastavalt - kaug-IP-aadress, hostinimi, port;
  • meetodid Lukk kliendi pistikupesadega. Seda tüüpi serveriga saate klientidega ürituste kaudu koostööd teha Avage lukustus- vastavalt pistikupesa blokeerimine ja blokeeringust vabastamine.

Praktika ja näited

Vaatame nüüd ülaltoodut konkreetne näide. Valmis allikaid saate alla laadida klõpsates.

Niisiis, vaatame ühte väga head näidet TServerSocketiga töötamise kohta (see näide on kõige visuaalsem abivahend selle komponendi uurimiseks). Allolevad allikad näitavad kõigi oluliste serverisündmuste logimist ning tekstisõnumite vastuvõtmise ja saatmise võimalust:

Näide 1. Logimine ja serveri töö uurimine, sõnumite saatmine/vastuvõtmine pistikupesade kaudu.

(...Siin tuleb faili päis ja vormi TForm1 ja selle eksemplari Form1 definitsioon) (Vaata täielikku allikat) protseduur Tvorm1.Button1Click(Saatja: TObject); alustada (Määrake port ja käivitage server) ServerSocket1.Port:= 1025; (Meetod Insert lisab stringi massiivi määratud kohas) Memo2.Lines.Insert(0,"Server käivitub"); ServerSocket1.Open; lõpp; Memo2.Lines.Insert(0,"Kuulamine pordis "+IntToStr(ServerSocket1.Port)); lõpp; protseduur TForm1.ServerSocket1Accept(Saatja: TObject; Socket: TCustomWinSocket); alustada (Siin võtab server kliendi vastu) Memo2.Lines.Insert(0,"Kliendiühendus aktsepteeritud"); lõpp; protseduur TForm1.ServerSocket1ClientConnect(Saatja: TObject; Socket: TCustomWinSocket); alustada (Siin ühendub klient) Memo2.Lines.Insert(0,"Klient ühendatud"); lõpp; protseduur TForm1.ServerSocket1ClientDisconnect(Saatja: TObject; Socket: TCustomWinSocket); alustada (Siin katkestab klient ühenduse)< "+Edit1.Text); end;

Memo2.Lines.Insert(0,"Klient on lahti ühendatud");

lõpp;

Kindlasti, kui teie server teenindab paljusid kliente, peate kindlasti salvestama iga kliendi kohta teatud teabe (nimi jne) ja siduma selle teabe pesaga sellest kliendist. Mõnel juhul pole seda kõike käsitsi teha (sokli käepidemega sidumine, kliendimassiivid jne) kuigi mugav. Seetõttu on iga pistikupesa jaoks spetsiaalne omadus - Andmed. Tegelikult on Data lihtsalt osuti. Seetõttu olge sellele atribuudile kliendiandmete kirjutamisel ettevaatlik ja järgige osutitega töötamise reegleid (mälu eraldamine, tüübi määratlus jne)!

Failide saatmine pistikupesa kaudu.

Siin vaatleme failide saatmist pistikupesa kaudu (JINXi nõudmisel) :-).

Niisiis, kuidas saata faili pistikupesa kaudu? Väga lihtne! Kõik, mida pead tegema, on avada see fail failivoona (TFileStream) ja saata see pesa kaudu (SendStream)! Vaatame seda näitega: Tuleb märkida, et meetod SendStream mida kasutab mitte ainult server, vaid ka klient ()

ClientSocket1.Socket.SendStream(srcfile)

Miks saab edastamise ajal mitu plokki üheks ühendada? Seda ka JINXi palvel :-). Suur tänu talle selle eest! Niisiis, esiteks tuleb märkida, et pistikupesa kaudu saadetud andmeid ei saa mitte ainult ühendada üheks plokiks, vaid ka eraldada mitme ploki vahel. Fakt on see, et pesa on tavaline voog, kuid erinevalt näiteks failivoost (TFileStream) edastab see andmeid aeglasemalt (saate aru - võrk,
piiratud liiklus
jne). Sellepärast kaks käsku:
ServerSocket1.Socket.Connections.SendText("Tere, ");
ServerSocket1.Socket.Connections.SendText("maailm!");

täiesti identne ühe käsuga: ServerSocket1.Socket.Connections.SendText("Tere, maailm!"); Ja sellepärast, kui saadate pesa kaudu näiteks 100 KB faili, siis inimene, kellele te selle ploki saatsite, saab mitu plokki, mille suurus sõltub liiklusest ja liinide ummistusest. Pealegi ei pruugi suurused olla samad. Sellest järeldub, et faili või muude andmete vastuvõtmiseks suur suurus Peaksite aktsepteerima andmeplokke ja seejärel ühendama need üheks tervikuks (ja salvestama need näiteks faili). Selle probleemi suurepärane lahendus on sama failivoog - TFileStream (või mälus olev voog - TMemoryStream). Saate pesast andmeid vastu võtta sündmuse OnRead (OnClientRead) kaudu, kasutades universaalset meetodit ReceiveBuf. Võite kasutada ka soklivoogu (vt artiklit TClientSocketi kohta). Ja siin on väike näide (ligikaudne):

Kuidas pistikupesa jälgida

See küsimus on keeruline ja nõuab pikka kaalumist. Praegu märgin lihtsalt, et saate alati oma programmi loodud pistikupesa jälgida :-).

Soklitel (nagu enamikul Windowsi objektidel) on oma käepide, mis on kirjutatud atribuudis Handle. Seega, kui olete selle deskriptori ära tundnud, saate vabalt hallata mis tahes pistikupesa (isegi kellegi teise programmiga loodud pistikupesa)! Tõenäoliselt peate kellegi teise pistikupesa jälgimiseks kasutama eranditult WinAPI Socketsi funktsioone.

Epiloog See artikkel näitab Delphi komponendiga TServerSocket töötamise põhitehnikaid ja mitmeid üldisi tehnikaid pistikupesade kaudu andmete vahetamiseks. Kui teil on küsimusi, saatke need mulle meili teel:[e-postiga kaitstud]

, ja veel parem – kirjutage selle saidi konverentsile (Delphi. Üldised küsimused), et teised kasutajad näeksid teie küsimust ja prooviksid sellele vastata! Karikh Nikolai (). Nitro Moskva piirkond

, Žukovski Rakenduse arendamiseks " Telefonikataloog » kasutatakse visuaalset keskkonda Delphi programmeerimine

  • 7. Programmi projekt sisaldab kolme akent:
  • 1. fMain on programmi põhivorm.
  • 2. fEditor - vorm kirjete lisamiseks/muutmiseks.

3. fDM - andmemoodul.

FDM-vormile lisame komponendi ADOConnection, 1 ADOTable tüüpi komponendi, 1 DataSource tüüpi komponendi. Topeltklõpsake komponendi ADOConnection atribuuti ConnectionString. Avaneb aken komponendi ühendamiseks ADO-ga (joonis 2):

Puc. 2. ADO-ga ühendamise aken.

Klõpsake nuppu Ehita. Avaneb uus aken (joonis 3), mis sisaldab ühenduse seadeid:

Riis. 3.

Valige Data Provider – Microsoft OLE DB Pakkuja SQL Serveri jaoks. Vahekaardil Ühendus: valige serveri nimi, kus teie andmebaas asub. Nüüd määrame atribuudi Connected väärtuseks Tõene. Muudame järgmisi ADOTable atribuute: Ühendus ADOConnection1-ga; Tabelinimi abonendil; Aktiivne kuni tõeni. Muutke järgmisi andmeallika atribuute (see on link tabelile): DataSet väärtuseks ADOTable.

Läheme põhivormi juurde. Valige käsk File -> Use Unit ja ühendage sellega DM-moodul. Nüüd näeme tabeleid põhivormilt. Me postitame selle põhivorm

komponendid. Need asuvad integreeritud keskkonna peaakna piirkonnas, mida nimetatakse komponentide paletiks (joonis 4).

Lisame põhivormile fMain kolm nuppu (joonis 5). Need on mõeldud praeguse kirje muutmiseks, uue lisamiseks ja kustutamiseks.

Joonis 5.

Vahekaart DataControls keskendub visuaalsele ( kasutajale nähtav) andmete kuvamise komponendid, nagu DBGrid (ruudustik, mis kuvab kõik andmed tabeli kujul ja võimaldab neid redigeerida), DBEdit (andmete redigeerimise väli, mis on mõeldud ühe kirjevälja sisestamiseks või redigeerimiseks, st tabeli lahter ), DBMemo (MEMO väljade redigeerimiseks) jne. Ainus erand on DBNavigatori komponent. See komponent ei ole mõeldud andmete kuvamiseks, vaid andmekogumis kirjete vahel liikumiseks, uue kirje sisestamiseks või vana kustutamiseks. Lisage ja valige DBGrid, selle DataSource atribuudis valige fDM.ADOTable. Ruudustik on reageerinud ja näeme väljade nimesid (joonis 6.).

Riis. 6.

Nüüd loome kirjete filtri erinevaid kriteeriume. Selleks lisa vormile kaks GroupBoxi komponenti. Sisesta objektiinspektoris (joonis 7.) komponendi GroupBox1 atribuudis Caption “Filter by one field” ja GroupBox2 komponendi jaoks “Filter by mitme välja”.

Joonis 7.

GroupBox1-le lisame 3 silti, 1 liitkasti, 1 redigeerimisnupu ja 2 raadionuppu. Label1 jaoks kirjutame atribuudis Caption “Otsi sisse”, Label2 jaoks “Sisesta andmed”, Label3 jaoks “Meetod”. ComboBox komponendi atribuudis Items sisestage kaks rida: perekonnanimi, telefon (joonis 8.).

Joonis 8.

RadioButtonil on pealdisomadused "Rea algusest" ja "Iga juhtum". Teises GroupBoxis lisage kolm silti atribuudiga Pealkiri: Perekonnanimi, Eesnimi, Telefon. Kolm redigeerimiskomponenti ja üks nupp pealdise atribuudiga "Otsi". Ja filtri eemaldamiseks lisage vormile veel üks nupp.

Nüüd loome andmeredaktori akna. Loome uus vormiriietus(Fail -> Uus -> Vorm). Nimetame selle atribuudi Name ümber fEditoriks. Kasutades käsku File -> Use Unit, ühendame vormiga DM andmemooduli. Nüüd peame vormile installima järgmised komponendid: 8 Label, 7 DBEdit, 1 DBComboBox.

Lõpetame DBComboBoxi komponendi. Redaktori avamiseks topeltklõpsake selle atribuudil Items. Sisestame sellesse kolm rida:

Tänav

Lane

Avenue

Salvestage tekst, klõpsates nuppu OK.

Ühendame juhtkomponendid. Hoides , valige kõik juhtkomponendid (kõik komponendid, välja arvatud silt). Valige nende DataSource atribuudis fDM.DSLichData, ühendades komponendid soovitud andmekogumiga (tabeliga). Eemaldame üldise valiku ja valime esimese DBEdit. Valige selle atribuudis DataField väli "Perekonnanimi". See atribuut ühendab valitud komponendi konkreetse tabeliväljaga. Samamoodi ühendame ülejäänud komponendid vastavate väljadega.

Parempoolses alumises osas installige vahekaardilt Andmekontrollid navigeerimiskomponent DBNavigator. See komponent on loodud kirjetes navigeerimiseks, kirje redigeerimisrežiimi lubamiseks, tehtud muudatuste salvestamiseks või tühistamiseks, uue kirje lisamiseks või olemasoleva kustutamiseks. Valige selle DataSource atribuudis fDM.DSLichData, et ühendada komponent põhitabeliga. Sellest komponendist on meil vaja ainult võimalust liikuda tabeli algusesse või lõppu, järgmise või eelmise kirje juurde. Seetõttu laiendame selle atribuuti VisibleButtons (komponendi nuppude nähtavus) ja määrame kõigi nuppude väärtuseks False, välja arvatud nbFirst, nbPrior, nbNext ja nbLast. Nendel nuppudel klõpsates kutsutakse välja ADOTable komponendi vastavad meetodid. Need meetodid teevad järgmist.

Esiteks - läheb tabeli esimesele kirjele. Eelnev – minge eelmise kirje juurde. Järgmine – liikuge järgmise kirje juurde. Viimane – minge viimase kirje juurde.

Kui DBNavigatoril on alles vaid neli nuppu, on need nupud piklikud. Vähendame komponendi laiust, et nupud saaksid tuttavama välimuse.

fDM.TLichData.Append;

DBEdit1.SetFocus;

Lisame meetodit kasutades tabelisse uus sissekanne. Järgmisena viime sisendi fookuse üle DBEdit1-sse, et kasutaja ei peaks seda ise tegema.

kui fDM.TLichData.Modified siis

fDM.TLichData.Post;

Siin salvestame tabelis tehtud muudatused, kui neid on, ja sulgeme akna.

Liigume edasi põhivormi juurde. Alustame nupust Uus tellija". peate igasse tabelisse lisama uue kirje ja seejärel avama redaktori akna:

fDM.TLichData.Append;

fEditor.ShowModal;

Genereerime nupu "Muuda" jaoks OnClicki protseduuri. Seal on ainult üks koodirida:

fEditor.ShowModal;

Selle tulemusena avaneb redaktori aken ja komponendid kuvavad praeguse kirje andmed.

Nupu "Kustuta" kood:

fDM.TLichData.Delete;

Liigume edasi andmete filtreerimise juurde. Selles filtris valime otsinguvälja, valime meetodi ja sisestame andmed.

Genereerime komponendi Edit2 jaoks sündmuse OnChange.

if ((Pikkus(Redigeeri2.Tekst) > 0)ja(Pikkus(Combobox1.Text) > 0)) siis

fDM.TLichData.Filtered:=false;

kui RadioButton1.Kontrollitud siis

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

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

fDM.TLichData.Filtered:=true;

else fDM.TLichData.Filtered:=false;

Filtri tingimuse rida tähendab järgmist – valige veerust need kirjed, mis algavad samade tähemärkidega, mis on sisestatud Edit2.Text.

Märksõna LIKE võimaldab võrrelda stringe, kasutades etteantud mustrit. Sel juhul peate teadma järgmist.

sümbol "%" (protsent) - asendab mis tahes märgijada.

Märk #39 – tähendab märgi " (üksjutumärk) arvu ASCII kooditabelis. Fakt on see, et filtreerimise väärtus tuleb määrata üksikjutumärkides ja kuna Delphis kasutatakse üksikuid jutumärke stringide piiramiseks, siis panna stringi sees üksik tsitaat, tuleb see kaks korda asetada.

Filtreerige mitme välja järgi. Loome nupule Otsi jaoks OnClicki sündmuse.

protseduur TfMain.Button3Click(Saatja: TObject);

fDM.TLichData.filtered:=false;

kui pikkus(redigeeri4.tekst) > 0, siis

filtr:= "PERENIMI LIKE "+ #39 + Redigeeri4.Tekst + "%" + #39;

kui pikkus(redigeeri5.tekst) > 0, siis

kui pikkus(filtr) >

filtr:=filtr + lisa + "NIMI LIKE "+ #39 + Redigeeri5.Tekst + "%" + #39;

kui pikkus(redigeeri6.tekst) > 0, siis

kui pikkus(filtr) > 0, siis add:= " ja " else add:="";

filtr:=filtr + add + "telefon LIKE "+ #39 + Redigeeri6.Tekst + "%" + #39;

kui pikkus(filtr) > 0, siis

fDM.TLichData.Filter:= filter;

fDM.TLichData.filtered:=true;

Showmessage("Kõik väljad on tühjad!");

Filtri keelamiseks klõpsake nuppu "Eemalda filter". Tema kood on selline:

fDM.TLichData.Filter:= "";

fDM.TLichData.Filtered:= false;

Teeme lahti Delfi ja käsu peale Faili/salvesta projekt nimega... Salvestame projekti samasse kausta, kuhu andmebaasi salvestasime. Kausta aadress C:\DBIBExpert . Hoiame kokku pas fail nime all TelSprav1.pas , A dpr faili TelSprav.dpr . Selles aknas kinnistul Pealkiri kirjutame « Telefonikataloog», kinnisvaras Nimi me kirjutame "TelefonSprav". Pange komponent vormile Peamenüü ja topeltklõpsake sellel, ilmub aken (joonis 50).

Joonis 50

Kinnisvaras Pealkiri kirjutame" Fail", kinnisvaras Nimi me kirjutame" Täida" Klõpsake sinisel ristkülikul ja alla ilmub teine ​​ristkülik (joonis 51).

Joonis 51

Valime selle. Kinnisvaras Pealkiri kirjutame" Sule", kinnisvaras Nimi me kirjutame" Zakrit" Valige paremal olev ristkülik. Kinnisvaras Pealkiri kirjutame" Redigeerimine", kinnisvaras Nimi me kirjutame" Redaktirov" ja nii edasi. Selle tulemusena peaksime saama midagi selle alammenüü sarnast (joonis 52, joon. 53, joon. 54).

Joonis 52

Joonis 53

Joonis 54

Nüüd viskame vormile komponendi Tööriistariba, vahekaardilt Win32. Kinnisvara Joonda paneme sisse alTop. Kinnisvaras EdgeBorders paneme kõik sisse Tõsi. See komponent võimaldab meil sellele nuppe asetada. See on tema peamine roll. Klõpsame sellel paremklõps hiirt ja valige kuvatavas alammenüüs Uus nupp(joonis 55).

Joonis 55

Ilmub nupp, mille jaoks peate valima pildi. Aga kõigepealt kinnisvaras Nimi me kirjutame" Dob" Pildi kuvamiseks peate samalt vahekaardilt komponendi maha viskama ImageList ja topeltklõpsake seda. Ilmub dialoogiboks (joonis 56), milles vajutades nuppu Lisa… peate valima sobivad pildid suurusega 16x16. Kui kõik pildid on valitud, klõpsake nuppu OK.

Joonis 56

Valime komponendi Tööriistariba1 ja kinnisvaras Pildid valige rippmenüüst Pildiloend1. Kohe ilmub nupule pilt. Kui pilt peaks erinema, siis tuleb atribuudis valida nupp ja ImageIndex Valige rippmenüüst sobiv.

Paremklõpsake komponendil Tööriistariba1 ja valige kuvatavas alammenüüs Uus eraldaja(Joonis 55). Nupu kõrvale ilmub eraldaja. Kinnistut me selle eest ei muuda nimi, sest see on lihtsalt nuppude eraldaja. Muudame selle laiust Laius. Teeme selle võrdseks 5-ga. Loome samamoodi veel kolm nuppu. Kinnisvara teises nupus Nimi me kirjutame" Punane" Kolmandas" Ydali" Neljandas" Välju" Asetage nuppude vahele eraldaja Uus eraldaja. Paneme veel ühe eraldaja, mille laius on ligikaudu võrdne 50. Viskame komponendi separaatori lähedusse Silt ja kinnisvaras Pealkiri Kirjutame perekonnanime. Komponendi kõrval Silt1 me tarnime komponendi Redigeeri, kinnisvaras Nimi me kirjutame" Perekond" Komponentide vahel Silt kliendi pistikupesadega. Seda tüüpi serveriga saate klientidega ürituste kaudu koostööd teha Muuda, täidab trükisõnas eraldaja rolli tühik Perekonnanimi. Viskame veel paar komponenti Silt kliendi pistikupesadega. Seda tüüpi serveriga saate klientidega ürituste kaudu koostööd teha Muuda. Viimasel on vara Nimi seada" Telefon" Mõlemad komponendid Muuda vaja vara puhastada Tekst. Telefoni sisendkomponendi kõrval (Muuda) asetage komponent Nupp kinnisvaras Nimi tutvustame Naiti.

Nüüd vahekaardilt Andmete juhtelemendid pead viskama komponendi vormile DBGrid. Venitage see kogu akna ulatuses Joonda paneme sisse alClient. Midagi sarnast peaksime õppima (joonis 57).

Joonis 57

Peaakna välimus on ehitatud.

Eraldi moodulisse paneme andmebaasile ligipääsu komponendid. Täidame käsu Fail/Uus/Muu… ja ilmuvas aknas (joonis 58) valige DataModule vajutame nuppu OK. Salvestage see sama nimega samasse kausta. DataModule1.pas kliendi pistikupesadega. Seda tüüpi serveriga saate klientidega ürituste kaudu koostööd teha DataModule.dpr.

Joonis 58

Kinnisvaras Nimi kirjuta nimi lühemalt DM . Sellesse aknasse paigutatakse andmebaasile juurdepääsu komponendid. Vahekaardilt InterBase Asetame järgmised komponendid: IBDatabase, IBStoredProc, IBQuery, IBTransaction. Jätame nende nimed muutmata, sest... Viskasime nad kõigepealt aknast välja. Need järjestatakse numbriga 1 lõpus. Pukseerige komponent vahekaardilt Andmejuurdepääs Andmeallikas ripploendis Andmekogum valime IBQuery1.

Nüüd kirjeldame iga komponendi rolli:

  • IBD andmebaas - keskne komponent andmebaasiga ühenduse loomiseks. Ühte komponenti saab korraga seostada ainult ühe andmebaasiga;
  • IBStoredProc– komponent on loodud töötama salvestatud protseduuridega. Võimaldab neid täita, anda sisendandmeid ja saada täitmise tulemust (väljundandmed);
  • IBQuery- võimaldab saata päringuid andmebaasi ja saada nende täitmise tulemus. Komponent on täielik analoog komponent TQuery. Peamine vara SQL;
  • IBT-tehing- vastutab kõigi selle komponendiga seotud andmebaasi tehingute toimimise eest;
  • Andmeallikas- On link komponentidega esindatud andmekogumite vahel TIBQuery kliendi pistikupesadega. Seda tüüpi serveriga saate klientidega ürituste kaudu koostööd teha TIBStoredProc, ja visuaalsed komponendid andmete kuvamiseks ja haldamiseks.
Me ei kirjelda kõigi nende komponentide kõiki omadusi. Andmebaasi loomise käigus peame igal juhul tutvuma kinnistuga, mida kasutame.

Niisiis, paremklõpsame komponendil IBD andmebaas Ilmub kontekstimenüü (joonis 59).

Joonis 59

Milles peate valima üksuse Andmebaasi redaktor… Ilmub aken Andmebaasi komponentide redaktor(joonis 60).

Joonis 60

Jaotises Ühendus valime kohalik, sest Praegu loome kohalikku andmebaasi. Põllul Andmebaas peate sisestama meie andmebaasi nime. Loomulikult saate kõike käsitsi sisestada, kuid mugavam on vajutada nuppu Sirvige. Kui nüüd minna oma andmebaasiga kausta (TELEFONSPRAVOCHNIK.FDB), siis seda selles kaustas ei kuvata. Selle andmebaasi valimiseks peate olema real Tüüp valige failid Kõik failid (*.*). Nüüd kuvatakse kõik selle kausta failid. Valige andmebaasi fail (TELEFONSPRAVOCHNIK.FDB) ja klõpsake OK.

Jaotises Andmebaasi parameetrid põllul Kasutajanimi sisesta oma sisselogimine - SYSDBA põllul Parool sisesta parool - masterkey. Sisselogimine ja parool peavad olema samad, mis sisestati andmebaasi loomisel IBekspert. Loomulikult haldame andmebaasi sisse kirjutatud programmi abil Delfi.

Rippmenüüs Märkide komplekt valime Win1251. Eemaldame linnukese Sisselogimisviip nii et te ei pea iga kord oma parooli sisestama. Otse aknas Seaded kuvatakse kõik, mille oleme määranud ja sisestanud.

Nüüd peate vajutama nuppu Test. Enne nupu vajutamist OK, peate andmebaasi testima. Ilmub aken (joonis 61).

Joonis 61

Kui see kuvatakse veateatega, võib üheks põhjuseks olla mittesobivus programmiga InterBase. Selle vea parandamiseks peate programmi desinstallima InterBase, kui see on paigaldatud. Ja kindlasti peate raamatukogu faili käsitsi kustutama gds32.dll aadressil C:\WINDOWS\system32.

Pärast neid kustutamisi peate kustutama ja tulelind, sest eemaldasime raamatukogu, IBekspert ei saa enam normaalselt töötada. Pärast kõiki neid toiminguid peate uuesti installima FireBird. Vea põhjuseid on mitu, kuid see on kõige levinum.

Valime komponendi IBQuery1 ja kinnisvaras Andmebaas valime IBD andmebaas 1. Kinnisvara Andmebaas tähistab komponenti TIBD andmebaas seotud antud andmekogumiga. Kinnisvaras Tehing vali IBT-tehing1. Kinnisvara Tehing vastutab tehingu valimise eest.

Põhikomponendi omadus TQuerySQL omades tüüpi TStringid . See stringide loend, mis sisaldab SQL päringud, mis näitab, millise tabeli või tabelitega töötatakse. Aga siis rakenduse täitmise ajal vara SQL saab programmiliselt genereerida klassile ühiste meetodite abil TStringid : Selge- puhastamine, Lisa– rea lisamine jne.

Nii et kinnistul SQL Klõpsake kolme punktiga nuppu ja ilmuvas aknas sisestage SQL päring (joonis 62).

Joonis 62

Taotlus kõlab järgmiselt: valige kõik väljad ( VALI *) tabelist TELEPHON_SPRAVOCCHNIK (SAAST TELEPHON_SPRAVOCCHNIK) ja sorteeri (kasvavalt) väljade järgi VÕTI (VÕTME JÄRGI). Vajutage nuppu OK.

Valime komponendi IBTtehing1 ja kinnisvaras Vaikeandmebaas valime IBD andmebaas 1 .

Valime komponendi IBStoredProc1, kinnisvaras Andmebaas valime IBD andmebaas 1 . Kinnisvaras StoredProcName valige ripploendist meie protseduur TEL_SPRAV_PROC sisse kirjutatud IBekspert.

Toome esile IBQuery1, vara - serveri vahemällu salvestatavate kliendiprotsesside (lõime) arv. Siin peate valima keskmise väärtuse sõltuvalt teie serveri koormusest. Vahemällu salvestamine toimub selleks, et mitte luua iga kord eraldi protsessi ja mitte tappa suletud pesa, vaid jätta need hilisemaks kasutamiseks. paneme sisse Tõsi .

Ühendame selle mooduliga (Andmemoodul1) põhimoodul TelSprav1 käsu käivitamisega Faili/kasuta üksust…, ilmuvas aknas (joonis 63.)

Joonis 63

valime TelSprav1 ja vajutage nuppu Kasutage ühikut. Pärast sõna rakendamine selles moodulis on jaotis kasutab põhimooduli nimega TelSprav1. Nüüd on moodul käes Andmemoodul1 teab põhimooduli olemasolust TelSprav1.

Läheme põhimooduli juurde TelSprav1 ja nüüd ühendame mooduli sellega Andmemoodul1. Nüüd teavad need kaks moodulit üksteise olemasolust.

Valige ruudustik DBGrid1 ja atribuutide rippmenüüs Andmeallikas vali DM.DataSource1 . Andmebaasi väljade nimed kuvatakse meie ruudustikus.

Nüüd loome akna andmete lisamiseks ja redigeerimiseks. Täidame käsu Fail/Uus/Vorm. Esiteks hoiame end vormis käsu peale Faili/salvesta projekt nimega... Põllul Faili nimi tutvustame moodulit AddovRedakt1.pas , A Vormi nimi - AddovRedakt.dpr . Kinnisvaras Nimi sisestage vormi nimi DobRed. Paneme vormile andmete sisestamiseks ja muutmiseks vajalikud komponendid:

  1. Tedit- perekonnanime sisestamiseks. Kinnisvaras Nimi me kirjutame Perekond Kinnisvaras Tekst tühjendage sisestusväli;
  2. Tedit- nime sisestamiseks. Kinnisvaras Nimi me kirjutame Imya. Kinnisvaras Tekst tühjendage sisestusväli;
  3. TDateTimePicker– kuupäeva sisestamiseks. Kinnisvaras Nimi me kirjutame VData. Atribuutide ripploendis Kuupäevarežiim valime dmUpDown, soovi korral saate valida erineva väärtuse;
  4. Tedit- telefoninumbri sisestamiseks. Kinnisvaras Nimi me kirjutame NomerTelefona. Kinnisvaras Tekst tühjendage sisestusväli;
  5. Tedit- sisendiks meiliaadress. Kinnisvaras Nimi me kirjutame Meil. Kinnisvaras Tekst tühjendage sisestusväli;
  6. TCheckBox– märk mobiiltelefoni omamisest. Kui märgite ruudu programmi töötamise ajal, on teil mobiiltelefon see inimene. Kinnisvaras Pealkiri me kirjutame Mobiiltelefon. Kinnisvaras Nimi me kirjutame Mobilnik;
  7. TComboBox– rippmenüü linna valimiseks. Kinnisvaras Nimi me kirjutame Gorod. Kinnisvaras Tekst tühjendage sisestusväli;
  8. TBupp– nupp andmete lisamise kinnitamiseks. Kinnisvaras Nimi me kirjutame Lisa. Kinnisvaras Pealkiri kirjuta OK;
  9. TBupp– nupp andmete redigeerimise kinnitamiseks. Kinnisvaras Nimi me kirjutame Redigeeri. Kinnisvaras Pealkiri me kirjutame OK.
Vormile viskasime 2 ühesugust nuppu, sest vajutades eraldi nupp ja määrab, millised toimingud tuleks andmetega teha. Loomulikult on see irratsionaalne meetod, kuid see on tõhus.

Salvestame kuju. Sulgeme projekti ja avame uuesti. Pärast projekti avamist peame nägema vahekaarti LisaRedakt1 (joonis 64).

Joonis 64

Täidame käsu Projekt/Lisa projekti… ja ilmuvas aknas (joonis 65).

Joonis 65

Valime faili AddovRedakt1.pas ja vajutage nuppu OK. Sama käsu abil valige fail DataModule1.pas kui meil vahekaarti pole Andmemoodul1. Seda käsku kasutatakse ainult siis, kui aken Projektijuht meil pole seda, mida vajame pas kliendi pistikupesadega. Seda tüüpi serveriga saate klientidega ürituste kaudu koostööd teha dpr failid. Aken Projektijuht tuleb käsu peale välja Vaade/projekt/haldur…

Ühendame redigeerimismooduli LisaRedakt1 põhimoodulisse TelSprav1. Samuti ühendame põhimooduli redigeerimismooduliga ja Andmemoodul1.

See on kõik! Vajalik selleks selles etapis, luuakse aknad. Liigume edasi programmeerimise juurde.

Sündmuste halduris OnClick(põhimoodul) nupu jaoks Lisa kirjutage järgmine kood:

menetlust TTelefonSprav.DabavitClick(Saatja: TObject);
alustada
   (kui vajutati nuppu "Addavit", tehke seda
   muutuja "ExiStsDobRed" aktiivne)

     ExiStsDobRed:=true;
   //vajutades nuppu "Dabavit" - "Tag=1"
     tag:=1;
   //tee nupp "Dob" kättesaadavaks
     DobRed.Dobav.Visible:=true;
   //pääsmatu “punane” nupp
     DobRed.Redact.Visible:=false;
   //ava aken
     DobRed.ShowModal;
lõpp;

Deklareerime globaalse muutuja ExiStsDobRed jaotises Var . See näeb moodulis välja selline.

var
  TelefonSprav: TTelefonSprav;
  ExiStsDobRed: boolean=false;

See muutuja näitab, kas aken on avatud Andmete lisamine ja redigeerimine. See muutuja boolean tüüpi ja vaikimisi võrdne Vale. Kui vajutate nuppu "Lisa" muutuv ExiStsDobRed võrdne Tõsi.

Igal komponendil on omadus silt, mida saab oma äranägemise järgi kasutada täisarvu tüüpi globaalse muutujana. Määrake 1 omadus silt, Selle väärtuse järgi ilmub vajalik nupp. Näiteks: me vajutasime nuppu Addov, käivitatakse ülalkirjeldatud sündmus.

Nagu ma juba mainisin, on andmete lisamise ja redigeerimise aknas 2 nuppu Addov, Redact(joonis 66).

Joonis 66

Pildil on kaks nuppu, kuid tegelikkuses kuvatakse ainult üks. Kuna neljandal koodireal on meil nupp Redigeeri muuta see nähtamatuks. Kolmandal real muudame nupu kättesaadavaks Lisa. Nende toimingute eest vastutab vara Nähtav. Viimasel real näitame akent Andmete lisamine või muutmine.