500 Faq de delphi


Toate pentru drenajul apelor subterane. Scurgerea sitului pe panta. precum și totul pentru canalizarea apei pluviale.

Ce fac cel mai bine FIBC, ce fac cu BDE?

1. Puteți seta independent parametrii tranzacțiilor, chiar și în timpul rulării.
2. Puteți efectua tranzacții pe mai multe baze de date.
3. Puteți crea interogări "live" direct la mai multe mese.
4. O aplicație care utilizează FIBC nu este necesară în suportul BDE,
Instalați și reglați.
5. Când se utilizează FIBC, este posibil să se folosească polys
Interbase.
Pot folosi FIBC pentru a lucra cu C ++ Builder?

Din cauza diferențelor în VCL, conectați FIBC la C ++ Builder 1.0 în practică
este imposibil. Sub C ++ Builder 3.0, FIBC-urile se ridică fără probleme. Pentru aceasta este necesar
Selectați Componentă / Instalare component nou, în câmpul Nume fișier unitate
fișier FIBDataset.pas cu o literă, apăsați Ok. Apoi, trebuie să vă conectați la proiect
gds32.lib și compilați. Apoi, pachete Component / Instalare
adăugați pachetul cu FIBC, iar biblioteca poate fi folosită.
Instalat Delphi, FIBC. De ce nu doriți să vă conectați la contul dvs.?

FIBC necesită prezența unui client Interbase fix.
De ce după finalizarea FIBTransaction.Commit toate seturile de date sunt închise?

Pentru o persoană rasfatată de AUTOCOMMIT în BDE,
neadecvat și neplăcut faptul că, la închiderea tranzacției
Închideți automat toate datele. Motivul pentru acest comportament
nu este în FIBC, ci în Interbase. Lucrul este că toate
Interbazele se efectuează numai în contextul tranzacției. În consecință,
Programatorul însuși trebuie să aibă grijă de reluarea datelor și
Restabilirea datelor curente după comiterea / revocarea. Pekomendyem
Utilizați metoda TFIBTransaction.CommitRetaining, care efectuează
Acționați fără a închide camera (caracteristică Interbase standard).
Cum pot să mă conectez la o bază de date cu o parolă implicită și un nume de utilizator?

1. Acest lucru se poate face, de exemplu, astfel:
cu începerea FABDatabase
DBParams.Clear;
DBParams.Add ('isc_dpb_user_name = SYSDBA');
DBParams.Add ('isc_dpb_password = masterkey');
UtilizațiLoginPrompt: = false;
Conectat: = adevărat;
se încheie;
2. Sau așa:
Utilizarea variabilelor de mediu:
în Autoexec.bat
SET ISC_USER = SYSDBA
SET ISC_PASSWORD = MASTERKEY
dar în TFIBDatabase.DBParams trebuie să vă înregistrați cel puțin, de exemplu
lc_ctype = win1251.Orice facilitate (sau bug :))
Prefixul isc_dpb_ pentru opțiunile prescrise în DBParams poate fi omis.
Vrea să introducă simbolurile Kiepish în tabel.

În primul rând, trebuie să știți că baza de date a fost creată cu o pagină de cod
win1251. În al doilea rând, puteți scrie în proprietatea DBParams a modulului snap-in
Șirul TFIBDatabase isc_dpb_lc_ctype = WIN1251. Puteți utiliza isc_dpb_
opyskat.
Când înregistrarea unei înregistrări se modifică, programul este înghețat. Pochemy? El nu a schimbat datele de pe server, deoarece nu am efectuat tranzacția pe tranzacție. Pochemy?

Apoi, care sunt setările pentru parametrii tranzacției în mod implicit.
În primul caz, este de așteptat, atunci când tranzacția finală va fi finalizată,
începe panshe (așteptați coaja), iar în al doilea caz, motivul - modul
no_rec_version ordinea tranzacției. Este posibilă selectarea problemelor menționate mai sus,
nappimep, având scris în TRParams proprietate și o eclipsă a tranzacției TFIBT obiect
următorii parametri:
isc_tpb_write
isc_tpb_nowait
isc_tpb_read_committed
isc_tpb_rec_version

prefixul isc_tpb_ poate fi, de asemenea, omis.
Într-adevăr nu se poate citi despre parametrii tranzacțiilor în Interbase
Ghid API (pagina 46 a cărții de la Interbase Mediakit).
Când se numește FIBDataSet.Open, apare periodic o eroare în pbd ^ [i]: = linia zero a metodei FetchCurrentRecordToBuffer.

Schimbați versiunea FIBC la o secțiune mai greoaie sau blocată a codului,
pe care apare o eroare cu un simplu instrument de eroare.
Cum să lucrați cu blocaje FIBC?

Ne conducem lucrarea cu câmpuri de blob. FIBDatase1BLOBFIELD - etaj
tipul setului de date BLOB FibDatabase1

Citirea dintr-un câmp de blob în OleContainer

var S: TStream;
începe
dacă nu FIBDataset1BLOBFIELD.IsNull atunci
începe
S: = FIBDataset1.CreateBlobStream (FIBDataset1BLOBFIELD, bmRead);
încerca
OleContainer1.LoadFromStream (S)
în cele din urmă
S.Free
se încheie;
se încheie;
se încheie;

Scrieți în câmpul blob de la OleContainer (apelat în BeforePost)

var S: TStream;
începe
S: = FIBDataSet1.CreateBlobStream (FIBDataSet1BLOBFIELD, bmReadWrite);
încerca
OleContainer1.SaveToStream (S)
în cele din urmă
S.Free
se încheie;
se încheie;
Cum să lucrați cu interfețele noi în RemoteDataModule?

(IDispatch (RemoteServer.AppServer) ca IAnother)

Trebuie remarcat că acest lucru va funcționa numai dacă utilizați DCOM ca transport.
Cum pot folosi TClientDataSet într-o aplicație locală cu tabele Paradox, fără a utiliza componentele TProvider și TRemoteServer?

Nu puteți scăpa de Furnizor (deși nu va trebui să renunțați la modulul de formular / date), dar puteți utiliza TClientDataSet într-o aplicație cu un singur nivel. Pentru a deschide Client DataSet, trebuie să alocați furnizorul de date manual.

De asemenea, trebuie să includeți modulul BDEProv în clauza Utilizări.
Cum se transferă numele de utilizator și parola la un modul de date la distanță (datamodule la distanță)?

În Modulul de date la distanță, renunțați la componenta TDatabase, apoi adăugați procedura de automatizare (elementul principal din meniul Editare | Adăugare la interfață) pentru conectare.

Verificați dacă proprietatea TDatabase a componentei HandleShared este setată la True.

procedura de conectare (nume utilizator, parola: WideString);
începe


DB.DatabaseName: = UserName + 'DB';
DB.Params.Values ​​['USER NAME']: = UserName;
DB.Params.Values ​​['PASSWORD']: = Parola;
DB.Open;
se încheie;

După ce ați creat această metodă de automatizare, puteți să o apelați utilizând:

RemoteServer1.AppServer.Login ( 'USERNAME', 'PASSWORD');
Cum pot determina serverele de aplicații disponibile pe această mașină prin intermediul Registry?

Citiți cheia sub HKEY_CLASSES_ROOT \ CLSID \ *, vizualizând-o cu privire la cheile care au subcheia "Borland DataBroker". Aceste apariții sunt serverele de aplicații.

Mai jos este un exemplu care încarcă numele serverelor de aplicații disponibile în căsuța de listă:

utilizează Registrul;
procedura TForm1.FormCreate (expeditor: TObject);

I: intreg;
TempList: TStringList;
începe
TempList: = TStringList.Create;
încerca
cu TRegistry.Create do
încerca
RootKey: = HKEY_CLASSES_ROOT;
dacă OpenKey ("CLSID", False) atunci
GetKeyNames (TempList);
CloseKey;
pentru I: = 1 la TempList.Count - 1
dacă KeyExists ( 'CLSID \' + TempList [I] + '\ Borland DataBroker') atunci
începe
în cazul în care OpenKey ( 'CLSID \' + TempList [I] + '\ ProgID', Fals)
atunci
începe
Listbox1.Items.Add (ReadString (''));
CloseKey;
se încheie;
se încheie;
în cele din urmă
gratuit;
se încheie;
în cele din urmă
TempList.Free;
se încheie;
se încheie;
Am inclus dbclient.dll în secțiunea "fișiere suplimentare" a opțiunilor de distribuire web, însă acest fișier nu este descărcat clientului. Cum pot remedia asta?

Fișierul .inf trebuie să includă șiruri de caractere cum ar fi:

FileVersion este versiunea fișierului din fișierul dvs. de cabină (verificați informațiile despre versiunea DBCLIENT pentru a vă asigura că respectați regulamentul).

Asigurați-vă că FileVersion se referă la versiunea DBCLIENT.DLL.

Puteți pune dbclient.dll în fișierul cabinei utilizând utilitarul CABARC, pe care îl veți găsi în dosarul Delphi \ bin.

O comandă de apel CABARC exemplară poate arăta astfel:

CABARC N DBCLIENT.CAB DBCLIENT.DLL
Cum să accesați metodele serverului de aplicații din TClientDataSet?

AppServer este o proprietate read-only care returnează interfața de server la distanță returnată de furnizorul de servicii de aplicații. Aplicațiile client pot comunica direct cu serverul de aplicații prin intermediul acestei interfețe.
Am nevoie de formulare pe serverul de aplicații?

Nu este necesar să fie vizibile, dar cel puțin unul trebuie să fie prezent. Pentru a face forma principală invizibilă, setați

în fișierul proiectului.

începe
Aplicație.ShowMainForm: = False;
Application.Initialize;
Application.CreateForm (TForm1, Form1);
Application.Run;
end.
Ce pot obține de la un ConstraintBroker (restricții de broker)?

ConstraintBroker vă permite să activați verificările de constrângere a datelor.

Acest lucru înseamnă că, atunci când solicitați date, luați împreună cu ele și regulile pe care trebuie să le satisfacă. Aceste reguli se aplică automat fără cod suplimentar.

Deoarece acest lucru se întâmplă fără o singură linie de cod, nu este necesar să rescrieți sau să actualizați aplicația de fiecare dată când schimbați regulile.

De fapt, aceasta este o soluție simplă pentru sarcina de a actualiza aplicația client fără a ieși din ea.

Fiecare aplicație care utilizează ConstraintBroker primește automat această calitate.
Să presupunem că utilizatorul a schimbat câmpul șir în Null. Cum pot determina atunci când manipulatorul OnUpdateData dacă acest câmp a fost modificat la linia Null sau câmpul pur și simplu nu a fost schimbat?

Utilizați proprietatea NewValue a clasei TField atunci când citiți cea de-a doua înregistrare (cea care conține modificările). Dacă valoarea returnată (varianta) este goală sau nu este atribuită, atunci câmpul nu a fost modificat.

Iată câteva coduri ilustrative:

var
NewVal: Varianta;

începe
. NewVal: = DataSet.FieldByName ( 'MyStrField') NewValue;
dacă VarIsEmpty (NewVal) atunci
ShowMessage ("Câmpul nu a fost editat")
altfel dacă VarIsNull (NewVal) atunci
ShowMessage ("Câmpul a fost anulat")
altfel
ShowMessage ("Valoare nouă a câmpului:" + String (NewVal));
se încheie;
Dacă vă uitați la sursa formularului RecError (în depozit), veți vedea cum utilizează aceste informații pentru a afișa șirul ""când se afișează erori de sincronizare a datelor.

Pe server, adăugați limite la nivel de scriere folosind proprietatea Constrângeri din limitele dvs. TQuery / TTable sau de nivel de domeniu, utilizând obiecte persistente TField (utilizând FieldsEditor sau CustomConstraint sau ImportedConstraint).

Dacă utilizați limite de nivel de câmp, acestea au efect atunci când datele sunt trimise către câmp (de exemplu, când părăsiți controlul asociat cu acest câmp (cum ar fi TDBEdit)).
Care este diferența dintre prize, DCOM și OLE Enterprise când le folosiți ca transport?

Prize (TCP / IP):
- clienții și serverul necesită o stivă TCP / IP;
- nu este necesară configurarea suplimentară a clienților;
DCOM:
- pe clienți și servere necesită prezența DCOM (inclusă în Windows NT 4.0, pentru Windows 95 este disponibilă ca opțiune)
- este necesară configurarea clientului (DCOM Configuration Utility - DCOMCNFG.EXE);
- suport încorporat pentru modelul de securitate Windows NT;
- susținerea apelurilor (metode);
CORBA
- clienții și serverele au nevoie de un broker de cereri obiect obișnuit;
- configurarea clientului este necesară;
- susținerea apelurilor (metode);
OLE Enterprise:
- clienții și serverele necesită OLE Enterprise;
- configurarea clientului este necesară;
- suport pentru apeluri (metode).
Când aplic ApplyUpdates la ClientDataSet, evenimentul OnNewRecord din partea serverului nu se declanșează pentru setul de date original. Cum pot remedia asta?

Nici un fel. Aceste actualizări merg direct prin BDE, nu prin componenta de date.

În Delphi 4.0 (C ++ Builder 4.0), situația sa schimbat radical.

În primul rând, un furnizor tipic de date (TProvider) poate specifica modul de actualizare a datelor.

În al doilea rând, noul tip de furnizor (TDataSetProvider) funcționează numai prin metodele corespunzătoare TDataSet.

Asta este - toate evenimentele din aceste condiții de pe server vor fi procesate în mod obișnuit.

Dacă utilizați o versiune mai veche a Delphi, atunci, ca de obicei, puteți recomanda utilizarea procedurilor stocate, în acest context vor fi metodele serverului de aplicații. Din păcate, sfatul este inacceptabil pentru transportul Sockets.
Cum pot selecta doar o parte din date dintr-o anumită poziție din setul de date de pe server către client?

Cea mai acceptabilă este utilizarea TQuery și Provider.SetParams.

Dar, de asemenea, o puteți face diferit:

În primul rând pe client, trebuie să citiți de pe server numai metadatele pentru setul de date. Acest lucru se poate face prin setarea PacketRecords la 0, apoi apelând la Open. Apoi trebuie să apelați metoda server (trebuie să definiți această metodă pe server), care poziționează cursorul pe prima înregistrare dorită.

În cele din urmă, setați PacketRecords la valoarea corectă, mai mare decât zero și apelați GetNextPacket.
De ce nu pot crea bibliotecile orientate pe ISAPI în Delphi 3 să gestioneze mai multe conexiuni?

Expertul pentru crearea DLL-ului ISAPI în Delphi 3 creează o bibliotecă complet sigur, dar nu expune pavilionul spunând aplicației că această bibliotecă este sigură în acest sens.

Acest lucru este ușor de rezolvat prin simpla adăugare a unei linii:

Prima linie din bloc este fișierul de proiect începător (DPR).
Cum se implementează testul minim pentru corectitudinea identificatorului global (GUID) și interfețele moștenite de la IDispatch (și, prin urmare, de sprijinire a metodelor de automatizare)?

Apelați CreateRemoteComObject, transmiteți GUID-ul interfeței și numele computerului la care încercați să vă conectați. Dacă funcția returnează o eroare, atunci există o problemă la server, altfel problema posibilă se referă la client.

const
MyGUID = ''; // Indiferent ce guid este.

var
Unk: IUnknown;
Disp: IDispatch;

se încheie;
Dacă această bucată de cod funcționează și problema persistă, atunci trebuie să mergeți pas cu pas prin codul clientului și să găsiți locul în care acesta creează fisiere. Dacă nu o puteți găsi, va trebui să porniți serverul sub debugger și să stabiliți o conexiune cu clientul, astfel încât să puteți depana în dreptul locului care dă leneșul.
Cum pot scăpa de numele serverului "înregistrat" ​​dacă nu vreau să îl folosesc mai mult?

Rulați executabilul serverului cu tasta / UNREGSERVER:

Acesta este modul obișnuit de a înregistra un server de automatizare OLE cu auto-înregistrare.
După ce am folosit clicul din dreapta al mouse-ului pentru a crea funcția furnizorului, cum să execut din nou comanda Export din tabel din meniul contextual?

Iată un exemplu simplu de copiere a unui fișier (comprimat sau nu):

----------
var
srcHandle, destHandle: Integer;
srcBuf, destBuf: TOFStruct;

Dacă aveți nevoie să copiați mai multe fișiere simultan, este mai eficient să utilizați secvența:

var
sursa: șir;
sourceHandle: Word;


.
sursă: = 'a: \ anyfile.ext';
.
sursă: = sursă + # 0;
sourceHandle: = _lopen (@source [1], READ sau OF_SHARE_DENY_NONE);
Schimbarea extensiei BITMAP.


Am schimbat extensia de imagine de la BMP la 3LG. Apoi, pentru a încărca fișierul * .3LG ca o imagine în componenta Image1, dau comanda
Image1.Picture.LoadFromFile ("C: \ TEST.3LG");
Am o eroare spunând că extensia este incorectă. Cum fac asta? (acesta este același BMP, dar tocmai am schimbat extensia pentru asta)

Consultați procedura RegisterFileFormat.

Articole similare