Latest Entries »

Bieži vien ir gadījumi, kad trāpās kāds nepazīstams datu tips vai vajag atrast noteiktu konstanti vai procedūru.

Tā kā šādos gadījumos Help vairs nepalīdz, jārīkojas šādi:

Programmas sākumā Uses sadaļā jāpievieno vēlamās bibliotēkas nosaukums (ja tāda vēl nav iekļauta), un tālāk jebkurā programmas daļā šis nosaukums jāievada atkārtoti, ar punktu. Parādīsies viss, kas ir iekļauts šajā bibliotēkā – visas konstantes, datu tipi, procedūras, funkcijas.

Tā var atrast gandrīz pilnīgi jebko un bieži vien arī ātrāk, nekā, meklējot Helpā vai internetā.

Lai lejupielādētu kādu failu no interneta, var izmantot šādu funkciju:

function LejupieladetFailu(const URL,FailaNosaukums:string):boolean;
const BuferaIzmers=1024;
var Sesija,hURL:HInternet;
Buferis:array[1..BuferaIzmers] of Byte;
BuferaGarums:DWORD;
f:File;
Aplikacija:string;
begin
result:=false;
Aplikacija:=ExtractFileName(Application.ExeName);
Sesija:=InternetOpen(PChar(Aplikacija),INTERNET_OPEN_TYPE_PRECONFIG,nil,nil,0);
try
hURL:=InternetOpenURL(Sesija,PChar(URL),nil,0,0,0);
try
AssignFile(f,FailaNosaukums);
Rewrite(f,1);
repeat
InternetReadFile(hURL,@Buferis,SizeOf(Buferis),BuferaGarums);
BlockWrite(f,Buferis,BuferaGarums)
until BuferaGarums=0;
CloseFile(f);
result:=True;
finally
InternetCloseHandle(hURL)
end
finally
InternetCloseHandle(Sesija)
end
end;

Funkcijas rezultāts parāda to, vai fails ir lejupielādēts, vai tomēr nav. Kļūdas gadījumā neparādās nekādi paziņojumi (error), bet rezultāts tiek saglabāts boolean datu tipā – ir vai nav – fails ir lejupielādēts, vai tomēr ne.

Funkcijā izmantotie mainīgie:
URL – adreses nosaukums, piemēram, http://www.kautkaadssaits.lv/faili/mans.txt
FailaNosaukums – faila nosaukums, kā to saglabāt datorā. Tam obligāti jābūt norādītam kopā ar mapi, piemēram, C:\Users\Es\Desktop\mansfails.txt

Delphi veido samērā lielus EXE failus, atšķirībā no C++ Builder. Piemēram, uzliekot EXE failam ikonu, kuras izmērs ir 2 kb (standarta ikona aizņem krietni vairāk), Delphi XE ģenerēs ap 800 kb lielu EXE failu, bet C++ Builder – tikai 50 kb. Ir iespējams šo izmēru samazināt.

Atvērsim projekta failu , *.dpr

Sākumā tas varētu izskatīties apmēram šāds:

program Grafika;

uses
Forms,
Programma in ‘Programma.pas’ {Form1};

{$R *.res}

begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

Tomēr, ja tiek izmantots Delphi 2010 vai XE, tad faila izmēru var samazināt, izņemot ārā visas direktīvas:
projekta failā pēc programmas nosaukuma jāiekopē šis kods:

{$IF CompilerVersion >= 21.0}
{$WEAKLINKRTTI ON}
{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}
{$IFEND}

Tas ļauj samazināt EXE faila izmēru par apmēram 50-90 kilobaitiem, bet dažos gadījumos arī vairāk.

Ja tiek izmantoti arī veci kompilatori, var dzēst relokācijas tabulu (relocation table), pēc “Uses” saraksta pievienojot:

{$SETPEFLAGS IMAGE_FILE_RELOCS_STRIPPED}

Pie Uses vēl jāpieraksta “Windows”, ja tas nav norādīts iepriekš.

Tagad projekta fails izskatās apmēram šādi:

program Grafika;

{$IF CompilerVersion >= 21.0}
{$WEAKLINKRTTI ON}
{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}
{$IFEND}

uses
Forms, Windows,
Programma in ‘Programma.pas’ {Form1};

{$SETPEFLAGS IMAGE_FILE_RELOCS_STRIPPED}

{$R *.res}

begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

Pilnīgi tukšai programmai šis kods ļauj samazināt EXE faila izmēru apmēram par 100 kilobaitiem, bet, ja programma ir lielāka, tad vairāk par 100 kb. Abas šīs darbības neietekmē programmas veiktspēju un “nebremzē” datoru. Programma nezaudē savu funkcionalitāti un neiegūst jaunas kļūdas (errorus). Pārbaudīts.

Papildus var iestatīt arī mazāka izmēra ikonu. Standarta Delphi ikona, atkarībā no kompilatora versijas, var aizņemt vairāk par 100 kb, bet 32×32 px ikonas aizņem tikai dažus kilobaitus. Tas arī ietilpst kopējā EXE faila gala izmērā un ikonas izmērs var būtiski ietekmēt pašas programmas kopējo izmēru.

Lai nomainītu EXE faila ikonu, izvēlamies Project –> Options –> Load icon

Projekta konfigurācijā Debug vietā vēlams izvēlēties Release, līdz ar to programmas EXE failā netiks iekļauta Debug informācija. Tā būtībā nav vajadzīga.

Tāpat visur, kur vien iespējams, vēlams *.BMP attēlu vietā izmantot *.PNG vai *.JPG attēlus – tie aizņem mazāk vietas.

Lielām programmām var veidot SFX arhīvu un kompresēt programmas resursus. Tāpat iespējams izskatīt dažādas alternatīvas metodes, strādājot ar citām programmām vai Microsoft Office.
Piemēram, ar VBScript ir iespējams izveidot jaunu Excel dokumentu un ierakstīt tajā visu vajadzīgo informāciju, izmantojot ciklu. Skriptu var vienkārši palaist no EXE un pēc tam likvidēt. Jaunu tukšu datubāzi var izvaidot arī ar nelielas procedūras palīdzību (ap 20 koda rindiņām), nevis ievietojot programmas resursos apmēram 300 kb lielu tukšu *.mdb failu. Atsevišķos gadījumos resursus, kurus nevar kompresēt, var lejupielādēt no interneta, attiecīgi samazinot programmas izmēru.

Var gadīties, ka procedūrai parametra veidā jānodod nevis tikai viens mainīgais, bet gan vesels masīvs. To var izdarīt vairākos veidos:

Type Ta=array of kaut kas;

Var a:Ta;

1. variants

Procedure Proc(a:Ta);


Procedūrā tiek veidota masīva kopija un procedūra strādā tikai ar šo datu kopiju, nevis ar pašu masīvu. Lielākais mīnuss ir tas, ka masīva nodošana procedūrai būs salīdzinoši lēna un ar lielu atmiņas apjomu, jo procedūrai tiks kopēti dati un atsevišķi izdalīta vieta datora operatīvajā atmiņā.

2. variants

Procedure Proc(var a:Ta);


Procedūrā kods strādā tieši ar mainīgo a un tā saturu

3. variants

Procedure Proc(const a:Ta);


Procedūrā nedrīkst mainīt mainīgā a datus

4. varians

Procedure Proc(out a:Ta);


Sākot izpildīt procedūru, masīvs tiek uzskatīts par tukšu, bet pēc procedūras izpildes var iegūt tā vērtības

No decimālās uz bināro:

procedure decbin(d:longint;x:integer);
var i,p:longint;
s:array[1..31] of byte;
sk:string;
begin
for i:=31 downto 1 do
begin
s[i]:=d mod 2;
d:=d div 2;
end;
for i:= 1 to 31 do
begin
sk:=sk+chr(s[i]+48);
end;
p:=pos(’1′,sk);
delete(sk,1,p-1);
writeln(sk:x);
end;

Piemēram, decbin(16,6); izvadīs uz ekrāna 10000 , x ir simbolu skaits no kursora iepriekšējās atrašanās vietas. Drīkst likt kā 1.

No binārās uz decimālo:

procedure bindec(b:longint;x:integer);
var bb:string; a,r:integer; s:longint;
begin
str(b,bb);
s:=0;
for a:=1 to (length(bb)) do
if bb[a]=#49 then
s:=s+round(exp(ln(2)*(length(bb)-a)));
write(s:x);
end;

Piemēram, bindec(101,3); izvadīs uz ekrāna 5 , x ir simbolu skaits no kursora iepriekšējās atrašanās vietas. Drīkst likt kā 1.

Modulis Pascalā

Moduļi ir bibliotēkas, kas satur konstantes, datu tipu aprakstus, mainīgos, procedūras un funkcijas, kuras var ielādēt atmiņā no diska tikai tad, kad programmā tās speciāli tiek pieprasītas. Katrs modulis ir translējams atsevišķi un var tikt izmantots jebkurā programmā. Ja programmā citādi nav prasīts, tad atmiņā pēc noklusējuma ir tikai Pascal valodas biežak izmantojamā daļa.

Moduļa struktūra ir analoģiska programmas struktūrai, tomēr ir dažas lielas atšķirības. Piemēram, apskatīsim moduli:

unit ;
interface
uses ; { neobligāts }
{ globālie apraksti }
implementation
uses ; { neobligāts }
{ lokālie apraksti }
{ procedūru un funkciju realizācija }
begin
{ inicializācijas kods }
end.

Moduļa virsraksts sākas ar rezervētu vārdu unit, aiz kura seko moduļa nosaukums (identifikators) tieši tāpat, kā gadījumā ar programmas nosaukumu. Nākamais moduļa elements ir atslēgas vārds interface. Tas apzīmē interfeisa sekcijas sākumu modulī – moduļa daļa, kura ir pieejama citiem moduļiem vai programmām, kurās tas tiek izmantots. Programmas modulis var izmantot citus moduļus, tāpēc tos uzskaita operatorā uses. Operators uses (ja tāds vispār ir) var atrasties divās vietās. Pirmkārt, tas var sekot uzreiz pēc atslēgas vārda interface. Šajā gadījumā jebkuras konstantes un datu tipi, kuri aprakstīti šo moduļu interfeisa sekcijā, var tikt izmantoti jebkurā šī moduļa interfeisa daļas aprakstā. Otrkārt, tas var atrasties aiz atslēgas vārda implementation. Šajā gadījumā visi apraksti no šiem moduļiem var tikt izmantoti tikai realizācijas sekcijā.

Piemērs: (mans.pas)

unit Mans;

interface

uses crt;
var a:integer;

procedure notiraekranu;
procedure rakstit;

implementation

procedure notiraekranu;
begin
clrscr;
end;

procedure rakstit;
begin
for a:=1 to 3 do
writeln;
end;

end.

Izmantošana programmas kodā: (Programma.pas)

Program manaprogramma;
Uses crt,Mans;
var …..;
begin
… (programmas kods);
notiraekranu;

end.

uses crt;
const n=4;
var izvele:array[1..n] of string[38];
mas:array[1..10] of real;
punkts,p,x,y,a,p2,p3:integer;
summa,vid:real;
ch:char;
procedure punkts2;
begin
cursoron;
clrscr;
writeln;
writeln(‘MasŒvs’:35);
writeln;
for a:=1 to 10 do
if mas[a]>0 then inc(p2);
if p2=0 then
writeln(‘ MasŒvs nav ievadŒts. Nospiediet jebkuru taustiģu un izv‰laties 1. funkciju!’)
else
for a:=1 to 10 do
writeln(‘ ‘,a,’: ‘,mas[a]:7:3);
writeln;
readkey;
end;
procedure punkts1;
begin
cursoron;
for a:=1 to 10 do
begin
clrscr;
writeln;
write(‘ ‘,a,’. masŒva elements: ‘);
readln(mas[a]);
end;
punkts2;
end;
procedure punkts3;
begin
cursoron;
clrscr;
writeln;
summa:=0;
p3:=0;
for a:=1 to 10 do
begin
summa:=summa+mas[a];
if mas[a]>0 then inc(p3);
end;
vid:=summa/10;
if p3=0 then
writeln(‘ MasŒvs nav ievadŒts. Nospiediet jebkuru taustiģu un izv‰laties 1. funkciju!’)
else
writeln(‘ MasŒva vid‰jais aritm‰tiskais: ‘,vid:8:3);
writeln;
readkey;
end;
procedure izvelne;
var i:integer;
begin
clrscr;
cursoroff;
for i:=1 to n do begin
gotoxy(x,y+i-1);
write(izvele[i]);
end;
textattr:=$70;
gotoxy(x,y+punkts-1);
write(izvele[punkts]);
textattr:=$17;
end;
begin
izvele[1]:=’ MasŒva ievads ‘;
izvele[2]:=’ MasŒva izvads ‘;
izvele[3]:=’ MasŒva vid‰jƒs v‰rtŒbas apr‰éinƒÕana ‘;
izvele[4]:=’ Iziet ‘;
punkts:=1;
x:=5; y:=5;
textattr:=$17;
izvelne;
repeat
ch:=readkey;
if ch=char(0) then begin
ch:=readkey;
case ch of
chr(80):
if punkts=1 then begin
gotoxy(x,y+punkts-1);
write(izvele[punkts]);
p:=punkts;
if p=1 then punkts:=4 else
punkts:=punkts-1;
textattr:=$70;
gotoxy(x,y+punkts-1);
write(izvele[punkts]);
textattr:=$17;
end; end; end else
if ch=chr(13) then begin
case punkts of
1:punkts1;
2:punkts2;
3:punkts3;
4:ch:=chr(27);
end;
izvelne;
end;
until ch=chr(27);
cursoroff;
clrscr;
end.

Izvēlne (menu) Pascalā

Piemērs izvēlnei Pascalā:

uses crt;
const norm=$17; sel=$70; n=3;
var izvele:array[1..n] of string[12];
punkts,p,x,y:integer;
ch:char;
Procedure punkts1;
begin
clrscr;
writeln(‘ Darbiba nr.1′);
readkey;
end;
Procedure punkts2;
begin
clrscr;
writeln(‘ Darbiba nr.2′);
readkey;
end;
Procedure izvelne;
var i:integer;
begin
clrscr;
for i:=1 to n do begin
gotoxy(x,y+i-1);
write(izvele[i]);
end;
textattr:=sel;
gotoxy(x,y+punkts-1);
write(izvele[punkts]);
textattr:=norm;
end;
begin
izvele[1]:=’ darbiba 1 ‘;
izvele[2]:=’ darbiba 2 ‘;
izvele[3]:=’ beigt’;
punkts:=1; x:=5; y:=5; textattr:=norm;
izvelne;
repeat
ch:=readkey;
if ch=char(0) then begin
ch:=readkey;
case ch of
chr(80):
if punkts=1 then begin
gotoxy(x,y+punkts-1);
write(izvele[punkts]);
p:=punkts;
if p=1 then punkts:=3 else
punkts:=punkts-1;
textattr:=sel;
gotoxy(x,y+punkts-1);
write(izvele[punkts]);
textattr:=norm;
end; end; end else
if ch=chr(13) then begin
case punkts of
1:punkts1;
2:punkts2;
3:ch:=chr(27);
end;

Grafiskā režīma inicializācija

Šis kods var noderēt, ja no galvas nezinat, ko vajadzēja rakstīt, lai pārietu no teksta režīma uz grafisko:

uses graph,crt;
var Gd,Gm,e:integer;
begin
Gd:=Detect;
e:=graphresult;
initgraph(Gd,Gm,”);
if e0 then writeln(‘Kluda, grafiskais rezims nestrada’)
else
begin
clrscr;
readkey;
end;
end.

Tomēr šo kodu var arī saīsināt

uses graph,crt;
begin
initgraph(0,0,”);
clrscr;
readkey;
end.

Šajā gadījumā ja grafiskais režīms nestrādās, uz ekrāna netiks izadīts kļūdas paziņojums un programma var pati aizvērties un neko neparādīt.

Follow

Get every new post delivered to your Inbox.