Sfaturi pentru cei care sunt de programare pe vb & vba, computerpress

Pentru vizualizarea informațiilor poate fi reprezentat printr-o secvență binară de octeți ca un șir de caractere hexazecimale (fiecare reprezentat printr-o pereche de caractere octet). Decizia în această sarcină destul de simplu, dar trebuie amintit că, în șirul VB poate conține orice secvență de octeți (adică, caractere în un singur octet ANSI-codificat), și un set de Unicode caractere (această opțiune este utilizată în versiunile pe 32 de biți ale VB) . În acest din urmă caz, fiecare caracter va ocupa o pereche de octeți consecutivi.







Funcția de conversie în formă hexazecimală poate fi implementată în această formă:

După cum puteți vedea, funcția permite lucrul cu bytes arbitrar și cu simbolurile Unicode. În cel de-al doilea caz (blnBytes = False), este efectuată o conversie automată de la Unicode la ANSI. Trebuie remarcat faptul că o astfel de conversie variabilă nu afectează conținutul șirului sursă în programul de apel, deoarece se folosește metoda de trecere a parametrului "By value" (ByVal).

Funcția funcției ConvertBytesToHexString este demonstrată în următorul test:

Comparați rezultatele pentru a înțelege mai bine diferența dintre codificările Unicode și ANSI. În primul caz, fiecare caracter este reprezentat de doi octeți (byte - două caractere hexazecimale): primul octet - codul caracterului real, iar al doilea - numărul dicționarului (pentru limba engleză este 00 la Rusă - 04). Pentru caracterele engleze, Unicode (mai exact primul său octet) și ASNI sunt aceleași.

Word conține câteva nume speciale pentru macrocomenzile care sunt executate automat în anumite evenimente predefinite. Utilizarea acestora vă permite să creați opțiuni alternative de procesare în locul funcțiilor încorporate. Iată o listă a acestor nume cu momentele de execuție:

AutoExec - când porniți Word sau încărcați un șablon global

AutoNew - când creați un document nou

AutoOpen - la deschiderea unui document existent

AutoClose - când documentul este închis

AutoExit - când închideți Word sau descărcați șablonul global

După finalizarea acestui cod, totuși, constatăm că, în acest caz, noua linie de meniu nu este doar creată, ci înlocuiește și cea deja existentă. Mai precis, situația arată astfel: pot exista mai multe linii de meniu în aplicație, dar numai una este vizibilă. În același timp, toate liniile de meniu disponibile sunt vizibile în fereastra Particularizare, dar nu puteți gestiona starea "vizibilă / ascunsă" (în caseta de selectare), dar este disponibilă numai operația de ștergere a barei de meniuri a utilizatorului.

Pentru a controla ieșirea de pe ecranul de meniu linia dorită, puteți scrie un macro special, care utilizează o casetă de dialog listă (pentru a apela mai bine macro pentru a crea un buton de pe bara de instrumente sau atașând combinația de taste):

Ar trebui să acordați atenție următoarelor puncte din codul dat:

  1. Setarea pentru o bară de stare a vizibilității ascunde automat restul liniilor.
  2. Din păcate, obiectul CommandBar nu are o proprietate care să ne permită să determinăm tipul de obiect (meniu, panou etc.). Prin urmare, suntem obligați să facem o căutare în contextul numelui obiectului (de aceea este necesar ca numele să conțină "Barul meniu").
  3. Funcția InStr utilizează modul de căutare text (pentru orice caz de litere). În acest caz, din anumite motive, este necesar să specificați primul parametru (opțional) al apelului.

Referindu-ne la macroul MenuBarVisible, primim o casetă de dialog cu o listă de linii de meniu (Figura 1). Selectând elementele din listă, vom vedea imediat linia de meniu dorită pe ecran.

Formarea ulterioară a meniului poate arăta cam așa:

Ca rezultat, primim un meniu cu o comandă și un link către submeniu (Figura 2). În acest sens, trebuie avut în vedere faptul că descrierile elementelor de comandă CommandBarPopup și CommandBarButton își fixează rigid tipul, iar CommandBarControl permite definirea tipului dinamic.

Proprietățile documentelor sunt parametrii pe care le puteți vedea prin deschiderea ferestrei Proprietăți. Există două seturi de proprietăți - construite și personalizate. Le puteți citi programatic folosind obiectele corespunzătoare BuildInDocumentProperties și CustomDocumentProperties, de exemplu, după cum urmează:

Aici trebuie să acordați atenție nevoii de a utiliza manipularea erorilor de software. De fapt, dacă anumiți parametri nu sunt definiți (de exemplu data ultimei tipăriri pentru documentul nou creat), accesarea proprietății Value produce o eroare.

Puteți citi o proprietate a unui anumit document, în special numărul de pagini, specificând indexul sau numele acestuia (următoarele rânduri sunt identice):

Cu toate acestea, este mai adecvată utilizarea constantelor VBA încorporate:

Acest lucru se datorează faptului că în următoarea versiune a Word, este posibil ca numerele și chiar numele proprietăților să se schimbe. Încă o dată, subliniem că citirea corectă a proprietăților ar trebui să arate astfel:







Unul dintre cititorii noștri a constatat că, din anumite motive, acest control nu dorește să lucreze în mediul VBA. Într-adevăr, când încercați să mutați-o din bara de instrumente în formular, primiți un mesaj de eroare: "Apel neașteptat la accesul la metodă sau proprietate".

De ce se întâmplă acest lucru, nu am putut înțelege, dar am găsit o soluție alternativă la întrebare: puteți să o faceți fără a utiliza elementul de control, care lucrează direct cu obiectul. Pentru a face acest lucru, utilizați comanda Instrumente de referință pentru a conecta biblioteca Microsoft Srcipt Control 1.0 și utilizați acest cod, referindu-se direct la obiect:

Sfat 385. Ce să căutați când măsurați intervalele de timp

În una dintre teleconferințe, am găsit problema "comportamentului anormal al funcției Timer. Documentația precizează că funcția returnează ora curentă a zilei în secunde (o valoare de tip unic), din care rezultă în mod clar că trebuie să cresc monoton (dar la miezul nopții, numărătoarea va începe din nou de la zero!). Cu toate acestea, persoana care a pus această întrebare a constatat că uneori valoarea variabilei sngDiff din fragmentul de cod de mai jos se dovedește a fi negativă.

Interesant, dacă scriem calculul intervalului de timp ca:

atunci totul începe să funcționeze corect.

Care este problema aici? Situația pare ciudată, dar numai la prima vedere. Faptul este că funcția Timer funcționează la nivelul de precizie de secunde și nu este adecvată pentru procesarea unei mii de secunde. Când afișezi valoarea Cronometrului, vei vedea un număr cu numai două zecimale.

Evident, atunci când convertiți timpul dintr-un format intern, apare o anumită pierdere de precizie. Prin urmare, trebuie să cunoașteți organizarea funcției Timer în sine, dar este probabil că are propriul format de date. Prin urmare, este posibil ca atunci când:

ultima variabilă este convertită de la unic la altul, iar în acest moment există o pierdere de precizie în ultima cifră. În general, acest lucru este destul de obișnuit, atunci când sunteți implicat în conversia formatelor de date numerice la punct de precizie. Încercați acest exemplu:

Se pare că mesajul "Ei bine, afaceri!" Este imposibil în principiu. Cu toate acestea, acesta va apărea ori de câte ori faceți o astfel de definiție a tipurilor de date:

Aceasta înseamnă că în acest caz va apărea o modificare a valorii unui număr atunci când îl convertiți de la un format real la altul (de aceea nu știm exact formatul intern al Timerului).

Deci, pentru intervalele de timp specificate, timerul nu se potrivește. Ce ar trebui să fac?

În cadrul Consiliului 193, pentru o măsurare mai precisă a intervalelor de timp, am recomandat utilizarea funcției GetTickCount:

Acesta oferă timpul în milisecunde de la ultima pornire sau repornire a sistemului de operare (adică contorul va fi resetat numai după 49 de zile de funcționare continuă a calculatorului). Rețineți că, chiar și pentru intervalele de nanosecunde, timpul nu va merge în direcția opusă, deoarece avem de-a face cu valori întregi deja transformate.

Am repetat acest sfat de mai multe ori și acum vrem să dăm încă o confirmare a corectitudinii sale.

Uneori în programe este necesar să se întâlnească astfel de construcții logice:

În acest caz, acest cod funcționează corect, dar potențial amenință funcționarea fiabilă (previzibilă) a programului. Pericolul este că, după cuvântul cheie If, ​​trebuie să apară o condiție logică. Prin urmare, sintaxa strictă a limbajului ar trebui să permită prezența unui cod care este numai următorul:

Cu toate acestea, din păcate, VB este, de asemenea, permis să folosească această înregistrare:

Această intrare este de fapt echivalentă cu sintaxa corectă sintactic de mai jos:

Eficiența acestui cod este determinată de faptul că orice număr întreg nonzer este convertit la o valoare booleană True și, prin urmare, verificarea ulterioară funcționează corect. Deci, care este pericolul pentru fiabilitatea programului?

Să presupunem că acum vrem să modificăm codul astfel încât unele acțiuni să fie efectuate cu o valoare de șir gol. Se pare că acest lucru necesită pur și simplu înlocuirea codului condiției folosind o negare logică:

Dar aici veți găsi o surpriză neplăcută: mesajul "Valoare goală" va fi întotdeauna dat - pentru orice valoare a variabilei șir.

Într-adevăr, următoarele linii de cod sunt echivalente:

Și aceste linii sunt, de asemenea, echivalente:

Acest lucru se datorează faptului că inversiunea logică a unei variabile întreg este efectuată mai întâi, care este convertită doar la o valoare booleană.

Pentru a nu suferi de astfel de probleme, scrieți expresii logice numai în mod explicit. În același timp, logica programului pare mult mai clară:

Acum, aruncați o privire asupra rezultatului obținut (Figura 3). În toate asemănările, vedem o diferență fundamentală: valorile atributelor sunt înregistrate în formatul setărilor regionale internaționale (indiferent de setările unui anumit sistem de operare) și elemente - în formatul setărilor naționale ale acestui computer. Aceasta înseamnă că ne confruntăm cu anumite probleme atunci când transferăm informații între sisteme cu setări regionale diferite.

Acesta este modul în care codul de citire a fișierului XML scris anterior a arătat astfel:

În ambele cazuri, pare să obținem rezultate egale și corecte. Există însă o nuanță importantă: prima opțiune funcționează cu un format internațional de date și, prin urmare, nu depinde de setările regionale, iar a doua va funcționa numai dacă setările regionale ale sursei și receptorul informațiilor sunt aceleași.

Mai recent, Cougar a introdus o nouă serie de surse de alimentare pentru PC-urile tradiționale - VTX, destinate utilizatorilor cu un buget limitat. În această revizuire, va fi luat în considerare modelul Cougar VTX600, care datorită caracteristicilor sale va fi unul dintre cele mai populare în această linie de surse de alimentare

La evenimentul anual Capsaicin SIGGRAPH din Los Angeles, AMD și-a consolidat poziția pe piața de PC-uri high-end cu noii procesori Ryzen Threadripper și GPU "Vega"

Pentru o construcție simplă și convenabilă a utilizatorilor obișnuiți companie de rețea ZyXEL a lansat urmatoarea versiune a platformei sale de Internet pentru conectarea la rețelele 3G / 4G prin USB-modem cu punct de acces Wi-Fi - ZyXEL Keenetic 4G III, pe care le considerăm în această recenzie

Pentru familia sa de routere și routere, ASUS a adăugat recent două modele foarte interesante: modelul 4G-AC55U și cel mai simplu 4G-N12. Acest articol va lua în considerare modelul emblematic ASUS 4G-AC55U

Young dar ambitioasa companie KREZ la inceputul acestui an a lansat un nou, model de laptop original, KREZ Ninja (modelul TM1102B32) care rulează Windows 10. Deoarece acest computer are un ecran pivotant, acesta poate servi ca o soluție universală - poate fi folosit cu succes pentru muncă, și pentru studiu și pentru jocuri

Dacă de multe ori imprimați fotografii și sunteți deja obosit să schimbați cartușele în imprimantă, acordați atenție echipamentului MFP Epson L850. O mare varietate de consumabile, o calitate excelentă a imprimării, o gamă largă de funcționalități - acestea sunt doar câteva dintre avantajele acestui model







Articole similare

Trimiteți-le prietenilor: