[ Pobierz całość w formacie PDF ]
.Checked = TRUE) thenlpFileName := 'COM2';if (CheckBox2.Checked = TRUE) thenlpFileName := 'COM1';hCommDev:= CreateFile(lpFileName, GENERIC_READ or GENERIC_WRITE, 0,NIL, OPEN_EXISTING, 0, 0);if (hCommDev INVALID_HANDLE_VALUE) thenbeginSetupComm(hCommDev, cbInQueue, cbOutQueue);dcb.DCBlength := sizeof(dcb);GetCommState(hCommDev, dcb);if (CheckBox3.Checked = TRUE) thendcb.BaudRate := CBR_1200;if (CheckBox4.Checked = TRUE) thendcb.BaudRate := CBR_9600;//-przyk³adowe ustawienia flag steruj¹cych DCB-dcb.Flags := dcb_fParity;dcb.Parity := ODDPARITY;dcb.StopBits := TWOSTOPBITS;dcb.ByteSize := 8;SetCommState(hCommDev, dcb);GetCommMask(hCommDev, fdwEvtMask);SetCommMask(hCommDev, EV_TXEMPTY);endelsecase hCommDev ofIE_BADID: MessageDlg('Niew³aœciwa nazwa portu '+lpFileName+' lub jest on aktywny ',mtError, [mbOk], 0);end;end;//-----------wysy³anie pliku--------------------------------------procedure TForm1.SendFileClick(Sender: TObject);vari : Integer;FileSizeHigh : DWORD;beginfor i := 0 to cbOutQueue doBuffer_O[i] := char(0); // czyœci bufor wyjœciowyProgressBar1.Max := 0;if (hCommDev > 0) thenbeginif((_lopen(PChar(FileListBox1.FileName), OF_READ))HFILE_ERROR) thenbeginhfile_s := _lopen(PChar(FileListBox1.FileName),OF_READ);ProgressBar1.Max := GetFileSize(hfile_s,@FileSizeHigh);while (_lread(hfile_s, @Buffer_O, 1) > 0) dobeginWrite_Comm(hCommDev, Buffer_O, 1); // 1 bajtProgressBar1.StepIt();end;_lclose(hfile_s);FlushFileBuffers(hCommDev);endelseApplication.MessageBox('Nie wybrano pliku do'+' transmisji ', 'Uwaga !',MB_OK);endelseApplication.MessageBox('Niew³aœciwa nazwa portu lub jest on'+' aktywny ', 'Uwaga !',MB_OK);end;//------------odbiór danych-------------------------------------------procedure TForm1.ReceiveClick(Sender: TObject);beginif (Read_Comm(hCommDev, SizeOf(Buffer_I)) > 0) thenbeginRichEdit1.Text := Buffer_I;endelsebeginRichEdit1.Text := 'Brak danych do odebrania';Beep();end;end;//--------------------------------------------------------------------end.Poprawnoœæ zastosowanych przypisañ sprawdzi³em, nawi¹zuj¹c za pomoc¹przedstawionego programu wspó³pracê z s¹siednim komputerem, na którymuruchomiony by³ Terminal dla Windows 3.11.Przesy³aj¹c pewien niewielki (ok.3kB) plik tekstowy, otrzyma³em w pe³ni poprawn¹, obustronn¹ transmisjê.Mo¿nate¿ zauwa¿yæ, ¿e u¿yliœmy tutaj funkcji Write_Comm() o trzech (a nie jakpoprzednio dwóch) parametrach.Uczyni³em tak dlatego, by uzyskaæ przedewszystkim pe³n¹ przejrzystoœæ ale te¿ i zgodnoœæ przypisañ z _lread().Zaprezentujê teraz trochê bardziej skomplikowan¹ w swojej budowie aplikacjê, zapomoc¹ której mo¿emy nadawaæ i odbieraæ oraz zapisywaæ na dysku zarówno plikijak i dowolne, wpisywane z klawiatury lub kopiowane z innych edytorów (np.Word) ci¹gi znaków.Jest rzecz¹ bardzo wa¿n¹, ¿e pisane przez nas programykomunikacyjne s¹ w pe³ni kompatybilne z profesjonalnymi edytorami tekstu.Analogicznie jak w przypadku odpowiednika napisanego w C++Builderzezaprojektowa³em w Object Pascalu uproszczony edytor IDE, którego obs³uga ukrytajest w procedurach obs³ugi zdarzeñ: CopyTextClick(), PasteTextClick()orazCutTextClick().Maj¹c bardziej kompletny przyk³ad w postaci formularza projektup_RS_06.bpr, omówionego w czêœci poœwiêconej Builderowi, bez problemu mo¿nasamodzielnie uzupe³niæ takie miniœrodowisko edycyjne prezentowane na bie¿¹cymprzyk³adzie.Wygl¹d dzia³aj¹cej aplikacji komunikacyjnej korzystaj¹cej ztakiego prostego IDE pokazano na rysunku 5.18, zaœ jej kod Ÿród³owy RS_17.pasprzedstawiono na wydruku 5.15.Odpowiedni projekt znajduje siê na CD w katalogu\KODY\DELPHI\RS_17\p_RS_17.dpr.Zastosowa³em tu tylko jedno okno edycji, wktórym wyœwietlamy zarówno pliki lub inne komunikaty przeznaczone do wys³ania,jak te¿ dane odbierane z portu szeregowego.W przedstawionej ni¿ej aplikacjiuwzglêdni³em ponadto mo¿liwoœæ wyœwietlania tekstu w linii tytu³owejformularza.G³Ã³wnym zadaniem tej linii bêdzie wyœwietlanie nazwy aktualnieedytowanego pliku.Dodatkowo bêdzie siê tam pojawiaæ równie¿ nazwa dzia³aj¹cejaplikacji.Wszystkie wymienione czynnoœci zostan¹ wykonane dziêki procedurzeFormCaption():procedure TForm1.FormCaption(const sFile_s: String);beginsFile := sFile_s;Caption := Format('%s - %s', [ExtractFileName(sFile_s),Application.Title]);end;Testuj¹c przedstawiony program, zapoznamy siê ponadto ze sposobami pos³ugiwaniasiê innego rodzaju oknami dialogowymi, za pomoc¹ których mo¿emy wczytaæ iewentualnie zapisaæ ró¿nego rodzaju dane.Projektuj¹c procedurê obs³ugizdarzenia FileOpenClick(), wykorzystaliœmy standardowe w³aœciwoœci dialoguTOpenDialog, za pomoc¹ którego mo¿emy wczytaæ wiêkszoœæ dostêpnych plików
[ Pobierz całość w formacie PDF ]