Методические указания к практическим работам


Қадам 3 – INI-файлын қолдану



бет7/7
Дата21.06.2016
өлшемі1.52 Mb.
#151556
түріМетодические указания
1   2   3   4   5   6   7

Қадам 3 – INI-файлын қолдану


Енді бағдарлама жұмысының алгоритімінің басын келесі түрдей ауыстырамыз:

  1. Бағдарлама ашылған жерден INI-файлын осы папкада іздейміз.

  2. Егер де ол бар болса, оны INI-файлында көрсетілген МҚ – ның жолына сәйкес ашамыз. Егер де ол жоқ болса, оны INI-файлында МҚ – ның жолы болмайды да келесі f) пунктіне көшеміз.

  3. Егер де ашылған папкада INI-файлы жоқ болса, онда e) пунктіне көшеміз.

  4. Егер де INI-файлы болса және де Database секциясы немесе PathBase кілті табылмаса, онда қате туралы мәлімет шығарамыз да келесі f) пунктіне көшеміз.

  5. Ашылған бағдарлама папкасында МҚ файылын іздейміз. Егер ол болса, оны ашып жұмысты орындаймыз. Егер де ол жоқ болса, онда f) пунктіне көшеміз.

  6. МҚ – ының файылын табу үшін экранға диалогты терезесін шығарамыз. Егер қолданушы оны диалогты терезеде таба алмаса, онда олармен қоштасып жұмысты аяқтаймыз.

  7. Қолданушы МҚ – ының файылын диалогты терезеде тапса, онда оны бағдарламада берілген жолды сақтау керек. Нақтыландыратын жауапты табылған жолды INI-файлына сақтаймыз.

  8. Табылған МҚ - мен байланысамыз да бағдарламаның жұмысын бастаймыз.

Жаңа алгоритмді тексеру және нақтылау үшін төмендегі мысалдарды орындаймыз:

  1. Қолданылатын модульдерге inifiles модулін қосамыз.

  2. Модуль формасының мәтініне өзгертулер енгіземіз, төмендегі қара шрифтпен жазылғандарды:

function FindFileBD(nmFileBD,nmIniFil:string;var scon:string; var dlg:TOpenDialog): string;

var sb,sIni:string;IniFil:TIniFile;

begin

sb:='';sIni:=ExtractFilePath(ParamStr(0))+ nmIniFil;

if FileExists(sIni) then

begin

IniFil := TIniFile.Create(sIni);

try

sb:=IniFil.ReadString('Database', 'PathBase', '');

if sb='' then ShowMessage('Ошибка INI-файла !'+#13#10+sIni);

finally

IniFil.Free;

end;

end;

if sb='' then sb:= ExtractFilePath(ParamStr(0))+ nmFileBD;

if Not(FileExists(sb)) then

begin

//Настройка диалога:



dlg.Filter:='Файл ' +nmFileBD+'|'+nmFileBD;

dlg.Title :='Найдите файл базы данных !';

dlg.InitialDir:=ExtractFilePath(ParamStr(0));

if dlg.Execute then begin

sb:=dlg.FileName;ChangeBasePath(scon,sb);

if MessageDlg('Сохранить путь к БД в настройках программы?',

mtConfirmation,[mbYes,mbNo],0)=mrYes then begin

IniFil := TIniFile.Create(sIni);

try

IniFil.WriteString('Database', 'PathBase', sb);

except

ShowMessage('Ошибка INI-файла !'+#13#10+sIni);

end;

IniFil.Free;

end;

end else begin

ShowMessage('Не найден файл БД:'+#13#10+sb+#13#10+'До свидания !');

sb:='';

end;


end;

Result:=sb;

if sb<>'' then ChangeBasePath(ConStr,sb);

end;
procedure TfmMain.FormCreate(Sender: TObject);

var sbase:string;

begin


sbase:=FindFileBD('BDMyWorld.mdb','MyWorld.INI',ConStr,dlgBD);

if sbase<>'' then begin

ADOQuery1.Active :=False;

ADOQuery1.ConnectionString :=ConStr;

ADOQuery1.Active :=True;

NameSortField:=DBGrid1.Columns[0].FieldName;Desc:=False;

NewQuerySQL;

end else Application.Terminate;



end;

  1. Назар аударыңыз! Келесі қадамға бармай тұрып, Active қасиетіне ADOQuery1 копонентасына False! мәнін беріңіз.

  2. Қолданылған модельдерге inifiles модулін қосыңыз және проекті компилировать ету керек. Менюдан CTRL+F9 таңдап және далее, қате болмаса келесі істі орындаңыз.

  3. Бағдарламаны проводник арқылы жіберіп, төмендегі тізімдер арқылы оның жұмысын тексеріңіз:

    1. МҚ – ның файлы да INI-файлы да жіберу папкасында жоқ.

    2. Тек қана INI-файлы жіберу папкасында бар.

    3. МҚ – ның файлы да INI-файлы да жіберу папкасында бар.

    4. INI-файлының ішінде қате бар, мысалы, Database секциясы жоқ, немесе PathBase кілті, немесе МҚ – на жол дұрыс көрсетілмеген.

Қандай да жағдайда бағдарлама жоғарыда жазылған алгоритмге сай жұмыс істеуі қажет.
Зертханалық жұмыс №6. «MyWorld» МҚ құру.

Алмастыру буферімен және графикалық бейнелермен жұмыс

BDMyWorld.mdb жобасы бар папканы қайтарыңыз.Мәліметтер қорында маңызды ролді Memo- өрісі атқарады. Бұл өріс құрамында өлшемі анықталмаған көпжолды мәтін болады.

1 –қадам Жаңа өріс құру және бастапқы форманы баптау.

  1. Ms-Access-те BDMyWorld.mdb файлын ашыңыз және содан кейін конструктор режимінде «Страны» кестесін ашыңыз. Осы кестеде жаңа өріс құрып, суретте көрсетілгендей етіп толтырыңыз:




  1. Ms-Access-ті жауып, Delphi-ге оралыңыз. Щелкните дважды мышью по компоненту ADOQuery1 компононтін екі рет шертіп, содан кейін пайда болған өрісті редактрлеу терезесінде тышқанның оң жағын шертіңіз. Қалқып шығатын менюден «Add Fields» пунктін таңдаңыз. Жаңа өрістер тізімде болуы керек.Редактор өрісін жабыңыз.

  2. DataControls бетінен біздің бастапқы формамыздың проектісіндегі DBImage-дің 3 компонентіне paLeft панелін ретпен жоғарыдан төмен орналастырыңыз.

  3. Инспекторе объектте барлық жаңа компоненттердің DataSource қасиетіне DataSource1 мағынасын орнатыңыз. ShowHint және Stretch қасиеттеріне True мағынасын орнатыңыз. Сонымен қатар төмендегі кестеде көрсетілген қасиеттерді де кестедегідей етіп орнатыңыз:

    Имя

    компонента

    Значения свойств

    DataFild

    Align

    Hint

    DBImage1

    Flag

    alTop

    ФЛАГ

    DBImage2

    Map

    alTop

    КАРТА

    DBImage3

    FOTO

    alClient

    ФОТОГРАФИЯ

  4. Қалқып шығатын көмек беруші тез қалқып шығуы үшін бастапқы формадағы OnCreate өңдеушісінің соңына төменде қалың қаріппен белгіленген процедураны жазыңыз:

procedure TfmMain.FormCreate(Sender: TObject);

var sbase:string;

begin

sbase:=FindFileBD('BDMyWorld.mdb','MyWorld.INI',ConStr,dlgBD);



if sbase<>'' then begin

ADOQuery1.Active :=False;

ADOQuery1.ConnectionString :=ConStr;

ADOQuery1.Active :=True;

NameSortField:=DBGrid1.Columns[0].FieldName;Desc:=False;

NewQuerySQL;

end else Application.Terminate;

Application.HintPause :=0;

end;


  1. DBImage компонентінің формасының өлшемін өзгерткенкезде әрқашан бірдей биіктікте болуы үшін, OnResize формасының төменде көрсетілген процедурасын жазыңыз:

  2. procedure TfmMain.FormResize(Sender: TObject);

begin

DBImage1.Height:=paLeft.Height div 3;

DBImage2.Height:=paLeft.Height div 3;

end;

  1. Жаңа өріске суретті графикалық файлдарды ашу жолы арқылы орналастырамыз, сонымен қатар алмасу буферінің көмегі арқылы . Әрбір компонент үшін кнопка құру ыңғайсыз болғандықтан, керек командаларды орындайтын қалқымалы меню құрамыз.

  2. Win32 бетінен ImageList компонентін формаға орналастырамыз және Name қасиетіне imClip мағынасын таңдаймыз, ал Width және Height қасиеттеріне 16 деген мән беріңіз. Содан кейін осы объектке екі рет шертіп, пайда болған Add кнопкасын басу арқылы ../STUDENT/Заготовки/Buttons папкасынан табуға болатын керек суреттерді қосыңыз :



Төменде көрсетілгендей етіп 12 суретті ретімен орналастырыңыз:


Имя файла с картинкой

(индекс) в наборе

penEnabled.bmp

0

OpenDisabled.bmp

1

PasteEnabled.bmp

2

PasteDisabled.bmp

3

CopyEnabled.bmp

4

CopyDisabled.bmp

5

CutEnabled.bmp

6

CutDisabled.bmp

7

SaveEnabled.bmp

8

SaveDisabled.bmp

9

ClearEnabled.bmp

10

ClearDisabled.bmp

11









Формаға PopupMenu компонентін орналастырыңыз және оның Name қасиетіне MenuClip мағынасын беріңіз. Кейін оған екі рет шертіп, дизайнер менюінде төменде көрсетілген пункттерді формалап оған төмендегі кестеде көрсетілген қасиеттерді беріңіз:


Name

Caption

ImageIndex

ShortCut

cmOpen

Открыть

0

F3

cmPaste

Вставить

2

Ctrl+V

cmCopy

Копировать

4

Ctrl+C

cmCut

Вырезать

6

Ctrl+X

cmSave

Сохранить как …

8

Shift+F2

cmClear

Очистить

10

Ctrl+Del



DBImage1, DBImage2 және DBImage3 компоненттерінің PopupMenu қасиетіне MenuClip мағынасын беріңіз.



2-қадам . Қалқып шығатын менюінің тосқауыл және рұқсат командалары.

Мүмкін болатын рұқсат етілген командалары:



  • «Открыть» командасына әрқашан рұқсат етіледі.

  • «Вставить» командасына рұқсат етіледі, егер графикалық сурет алмасу буферінде болған жағғдайда.

  • Ал қалған командаларға рұқсат етіледі, егер МҚ-ның сәйкес өрісінің құрамында сурет болған жағдайда.

Меню пайда болатынның алдындағы OnPopup жағдайын қолданамыз. Онда МҚ-ның қай өрісінде тексерілетін берілгендер бар екенін міндетті түрде анықтау керек:

  1. Қолданылатын модульдер құрамына clipbrd. Модульін қосыңыз.

  2. Отметьте на Формада ClipMenu компонентін белгілеңіз және инспектора объект көмегімен OnPopup жағдайының төменде көрсетілген өңдеушісін құрыңыз:

procedure TfmMain.MenuClipPopup(Sender: TObject);

var j:integer;

dbIM:TDBImage; //Ссылка на компонент, из которого вызвано меню

nmField:string; //Имя поля БД, с которым связан компонент

tmf:TMemoField; //Ссылка на поле БД, с которым связан компонент

begin


nmField:=''; dbIM:=nil;

// Запрет – разрешение пунктов меню:

With MenuClip do begin

Items[1].Enabled := Clipboard.HasFormat(CF_PICTURE); //Вставка

if PopupComponent is TDBImage then dbIM:=(PopupComponent as TDBImage);

if dbIm<>nil then begin

nmField:=dbIM.DataField;

tmf:=dbIM.DataSource.DataSet.FieldByName(nmField) as TMemoField;

if tmf<>nil then begin

if tmf.BlobSize>0 then Items[2].Enabled :=True

else Items[2].Enabled :=False; //Копирование

Items[3].Enabled :=Items[2].Enabled; //Вырезка

Items[4].Enabled :=Items[2].Enabled; //Сохранение

Items[5].Enabled :=Items[2].Enabled; //Очистка

end;

end;

//Присвоить номера картинок для пунктов меню:

for j:=0 to Items.Count -1 do

if Items[j].Enabled then Items[j].ImageIndex:=2*j

else Items[j].ImageIndex:=2*j+1;

end;

end;



  1. Программаны жіберіп, оны тексеріңіз. Егер алмасу буферінде графикалық сурет бар болса, онда қою командасы рұқсат етілген болып есептеледі, ал басқа жағдайда тосқауыл қойылған болып есептеледі.

3-қадам. Қалқып шығатын меню командаларын программалау.

  1. Формаға Dialogs терезесінен OpenPictureDialog және SavePictureDialog, компоненттерін орналастырыңыз, содан кейін олардың Name қасиетіне dlgOpenImage және dlgSaveImage мағыналарын меншіктеңіз..

  2. Дизайнер менюінде щелкните по пункту «Открыть» пункті бойынша шертіп, төменде көрсетілген процедураны құрыңыз:

  3. procedure TfmMain.mcOpenClick(Sender: TObject);

var dbIM:TDBImage;

begin


if Not(dlgOpenImage.Execute) then Exit;

dbIm:=nil;

With MenuClip do

if PopupComponent is TDBImage then dbIM:=(PopupComponent as TDBImage);

if dbIm<>nil then begin

if dbIM.DataSource.State <> dsEdit then dbIM.DataSource.Edit;

dbIM.Picture.LoadFromFile(dlgOpenImage.FileName);

dbIM.DataSource.DataSet.Post;

end;

end;


  1. Программаны орындауға жіберіңіз және «Открыть» командасының жұмысын кез- келген сурет арқылы тексеріңіз.

  2. 2-ші пункттегідей етіп менюдің басқа пункттері үшін төменде көрсетілген процедураны құрыңыз:

procedure TfmMain.mcPasteClick(Sender: TObject);



var dbIM:TDBImage;

begin


dbIm:=nil;

With MenuClip do

if PopupComponent is TDBImage then dbIM:=(PopupComponent as TDBImage);

if dbIm<>nil then begin

try

dbIm.PasteFromClipboard;

dbIM.DataSource.DataSet.Post;

except

ShowMessage('Буфер не содержит необходимый рисунок.');

end;

end;

end;
procedure TfmMain.mcPasteClick(Sender: TObject);



var dbIM:TDBImage;

begin


if Not(Clipboard.HasFormat(CF_PICTURE)) then Exit;

dbIm:=nil;

With MenuClip do

if PopupComponent is TDBImage then dbIM:=(PopupComponent as TDBImage);

if dbIm<>nil then begin

try

dbIm.PasteFromClipboard;

dbIM.DataSource.DataSet.Post;

except

ShowMessage('Ошибка сохранения рисунка.');

end;

end;

end;
procedure TfmMain.mcCopyClick(Sender: TObject);



var dbIM:TDBImage;

begin


dbIm:=nil;

With MenuClip do

if PopupComponent is TDBImage then dbIM:=(PopupComponent as TDBImage);

if dbIm<>nil then dbIM.CopyToClipboard;

end;
procedure TfmMain.mcCutClick(Sender: TObject);



var dbIM:TDBImage;nmField:string;

begin


dbIm:=nil;

With MenuClip do

if PopupComponent is TDBImage then dbIM:=(PopupComponent as TDBImage);

if dbIm<>nil then begin

dbIM.CutToClipboard;nmField:=dbIM.DataField;

if dbIM.DataSource.State <> dsEdit then dbIM.DataSource.Edit;

dbIM.DataSource.DataSet.FieldByName(nmField).Clear;

dbIM.DataSource.DataSet.Post;

end;

end;
procedure TfmMain.mcSaveClick(Sender: TObject);



var dbIM:TDBImage;

begin


if Not(dlgSaveImage.Execute) then Exit;

dbIm:=nil;

With MenuClip do

if PopupComponent is TDBImage then dbIM:=(PopupComponent as TDBImage);

try

if dbIm<>nil then dbIM.Picture.SaveToFile(dlgSaveImage.FileName);

except

ShowMessage('Ошибка записи в файл:'+#13#10+dlgSaveImage.FileName);

end;

end;
procedure TfmMain.mcClearClick(Sender: TObject);



var dbIM:TDBImage;nmField:string;

begin


dbIm:=nil;

With MenuClip do

if PopupComponent is TDBImage then dbIM:=(PopupComponent as TDBImage);

if dbIm<>nil then begin

nmField:=dbIM.DataField;

if dbIM.DataSource.State <> dsEdit then dbIM.DataSource.Edit;

dbIM.DataSource.DataSet.FieldByName(nmField).Clear;

dbIM.DataSource.DataSet.Post;

end;

end;



  1. МҚ-ын суреттермен толтыру үшін сонымен қатар әлемдегі елдердің туларын ..\STUDENT\Заготовки\DataWorld папкасынан іздеуге болады.

4-қадам. –Drag&Drop технологиясы бойынша графикалық файлдарды тасымалдау.

Егер қолданушы проводниктен немесе біздің жобаға басқа программадан графикалық файлдарды тышқын арқылы тасымалдауға мүмкіндік болса жақсы болар еді. Бұл тәсіл Windows технологиясы бойынша «Drag and Drop» деп аталады.

Біз алгоритмді орындаймыз:



  1. Формаға орналастырған файлдың атын анықтаймыз.

  2. «жіберу» кезіндегі тышқанның координаттарын анықтаймыз.

  3. Бұл сәтте тышқан курсоры қай компонентте болғанын анықтаймыз.

  4. Берілген компонент файлды «қабылдай» алады ма дегенді тексереміз.

  5. Егер иа болса , онда файлды өңдеу үшін сәйкес әдісті шақырамыз.




  1. Қолданылатын модульдер тізіміне ShellAPI модульін қосыңыз.

  2. Форманың модульінің private және public кілттік сөздерінің арасына

қалың шрифтпен ерекшеленген мәтінді орналастырыңыз:

……………………………………….

private

{ Private declarations }



drFile: array[0..256] of char;

XYPoint:TPoint;

nmComp:string;

protected

procedure WMDropFiles (var Msg: TMessage);message wm_DropFiles;

public


{ Public declarations }

end;


…………………………………………

  1. OnCreate формасының өңдеушісіне төменде қалың шрифтпен берілген жолды қосыңыз:

procedure TfmMain.FormCreate(Sender: TObject);

var sbase:string;

begin

sbase:=FindFileBD('BDMyWorld.mdb','MyWorld.INI',ConStr,dlgBD);



if sbase<>'' then begin

ADOQuery1.Active :=False;

ADOQuery1.ConnectionString :=ConStr;

ADOQuery1.Active :=True;

NameSortField:=DBGrid1.Columns[0].FieldName;Desc:=False;

NewQuerySQL;

end else Application.Terminate;

Application.HintPause :=0;



DragAcceptFiles(Handle,True);

end;


  1. Поместите текстовый курсор на заголовок процедуры WMDropFiles процеурасының атауына мәтіндік курсорды орналастырыңыз.. Бірдей уақытта CTRL+SHIFT+C –ті басыңыз. Delphi төменде көрсетілген шаблонды құрады.Осыған қалың шрифтпен ерекшеленген жолды теріңіз:

procedure TfmMain.WMDropFiles(var Msg: TMessage);

begin

DragQueryFile(THandle(Msg.WParam),0,drFile,SizeOf(drFile));

DragQueryPoint(THandle(Msg.WParam),XYPoint);

DragFinish(THandle(Msg.WParam));

//Отладочная строка:

Caption:= String(drFile)+'-'+IntToStr(XYPoint.x)+'-'+IntToStr(XYPoint.y);

end;



  1. Жобаны орындауға жіберіп және ярлыктарды жұмыс столынан формаға тасымалдап, форманың атауында файлдың «дұрыс» аты және тышқанның координаты дұрыс берілгеніне көз жеткізу керек.

  2. Сонымен біз алгоритмнің 1) және 2) пункттерін орындадық . Тышқанды «жіберу» болған компонентті анықтайық.

  3. WMDropFiles процедурасына қалың шрифтпен ерекшеленген жолдарды қосыңыз және (отладочную) жолды төмендегідей етіп өзгертіңіз:

procedure TfmMain.WMDropFiles(var Msg: TMessage);

var j:integer;

R:TRect;

ctr:TControl;

begin


nmComp:=''; ctr:=nil;

DragQueryFile(THandle(Msg.WParam),0,drFile,SizeOf(drFile));

DragQueryPoint(THandle(Msg.WParam),XYPoint);

DragFinish(THandle(Msg.WParam));



for j := 0 to ComponentCount-1 do begin

if (Components[j] is TDBImage) then begin

ctr:= Components[j] as TControl;

R.Left :=ctr.Left+paLeft.Left;R.Top :=ctr.Top+paLeft.Top;

R.Right := R.Left+ctr.ClientWidth;R.Bottom :=R.Top+ctr.ClientHeight;

With R do

if (XYPoint.x >Left) and(XYPoint.x

(XYPoint.y >Top) and(XYPoint.y

nmComp:= ctr.Name;Break;

end;

end;

end;

if nmComp<>'' then ShowMessage(nmComp);

//Отладочная строка:

fmMain.Caption:= IntToStr(XYPoint.x)+'-'+IntToStr(XYPoint.y)+' / '+

IntToStr(R.Left)+'-'+IntToStr(R.Top)+'-'+

IntToStr(R.Right)+'-'+IntToStr(R.Bottom);

end;


  1. Жобаны қайтадан орындауға жіберіңіз және тасымалдау аяқталғаннан кейін программа DBImage компонентінің атының дұрыстығы туралы хабар беретініне көз жеткізіңіз.

  2. Бізге алгоритмнің d) және e) пункттерін іске асыру қалды. Жұмыс сенімді болуы үшін қолданушыға .bmp кеңейтілуі бар файлдарды тасымалдауға рұқсат береміз. Ол үшін мәтінге төменде қалың шрифтпен берілген жолды қосып, (отладочную) жолды алып тастаңыз :

procedure TfmMain.WMDropFiles(var Msg: TMessage);

var j:integer;

R:TRect;

ctr:TControl;



dbIM:TDBImage;

begin


nmComp:='';ctr:=nil;dbIm:=nil;

DragQueryFile(THandle(Msg.WParam),0,drFile,SizeOf(drFile));

DragQueryPoint(THandle(Msg.WParam),XYPoint);

DragFinish(THandle(Msg.WParam));

for j := 0 to ComponentCount-1 do begin

if (Components[j] is TDBImage) then begin

ctr:= Components[j] as TControl;

R.Left :=ctr.Left+paLeft.Left;R.Top :=ctr.Top+paLeft.Top;

R.Right := R.Left+ctr.ClientWidth;R.Bottom :=R.Top+ctr.ClientHeight;

With R do

if (XYPoint.x >Left) and(XYPoint.x

(XYPoint.y >Top) and(XYPoint.y

nmComp:= ctr.Name;Break;

end;


end;

end;


if nmComp<>'' then begin

dbIM:=ctr As TDBImage;

if not(dbIm is TDBImage) then Exit;

if dbIM=nil then Exit;

if not(ExtractFileExt(drFile)='.bmp') then Exit;

try

if dbIM.DataSource.State <> dsEdit then dbIM.DataSource.Edit;

dbIM.Picture.LoadFromFile(drFile);

dbIM.DataSource.DataSet.Post;

except

ShowMessage('Ошибка записи в БД изображения из файла:'+#13#10+drFile);

end;

end;

end;


  1. Әртүрлі нақты суреттерді формаға тасымалдау программасының жұмысын тексеріңіз:



Достарыңызбен бөлісу:
1   2   3   4   5   6   7




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет