[ Pobierz całość w formacie PDF ]
.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);beginProgressBar1.Max := 0;if (Read_Comm(hCommDev, SizeOf(Buffer_I)) > 0) thenbeginRichEdit1.Text := Buffer_I;endelsebeginRichEdit1.Text := 'Brak danych do odebrania';Beep();end;end;//--------transmisja danych wpisanych---------------------------------procedure TForm1.SendWrittenClick(Sender: TObject);beginif (hCommDev > 0) thenbeginStrCopy(Buffer_O, PChar(RichEdit1.Text));ProgressBar1.Max := 0;ProgressBar1.Max := SizeOf(PChar(RichEdit1.Text));Write_Comm(hCommDev, Buffer_O, StrLen(Buffer_O));ProgressBar1.StepIt();FlushFileBuffers(hCommDev);endelseApplication.MessageBox('Niew³aœciwa nazwa portu lub jest on'+' aktywny ', 'Uwaga !',MB_OK);end;//--------------------------------------------------------------------end.Ze wzglêdu na to, ¿e korzystamy tu z TRichEdit, dane si³¹ rzeczy bêd¹ zapisanew tym formacie.Widoczne jest to przy próbie odczytu tak przetransmitowanegopliku.Je¿eli nie jest on wyœwietlany w zgodnym formacie, tekst bêdziepoprzedzony specjalnymi znakami formatowania.Trudnoœæ tê mo¿na przezwyciê¿yæ,je¿eli zastosujemy w zdarzeniach czytaj¹cych i zapisuj¹cych pliki na dyskukonstrukcje typowe dla Object Pascala.Procedury alternatywne do tychprzedstawionych na wydruku 5.15, obs³uguj¹ce typowe pliki tekstowe, zpowodzeniem mog¹ przyj¹æ nastêpuj¹c¹ budowê:procedure TForm1.FileOpen_2Click(Sender: TObject);varInFile : TextFile;sFname, sIndata : String;beginRichEdit1.Lines.Clear;if OpenDialog1.Execute thenbeginsFname := OpenDialog1.Filename;AssignFile(InFile, sFname);Reset(InFile);while not EOF(InFile) dobeginReadLn(InFile, sIndata);RichEdit1.Lines.Add(sIndata);end;CloseFile(InFile);Form1.Caption := 'Edycja [' + sFname + ' ]';end;end;//--------------------------------------------------------------------procedure TForm1.FileSave_2Click(Sender: TObject);varOutFile : TextFile;sFname : String;beginif SaveDialog1.Execute thenbeginsFname := SaveDialog1.FileName;AssignFile(OutFile, sFname);Rewrite(OutFile);WriteLn(OutFile, RichEdit1.Text);CloseFile(OutFile);Form1.Caption := 'Zapisany [ ' + sFname + ' ]';end;end;//--------------------------------------------------------------------Zauwa¿my, ¿e po raz pierwszy mamy mo¿liwoœæ wykorzystania pêtli, która doobiektu TRichEdit ³aduje kolejne wiersze pobrane z pliku.Wiele miejsca poœwiêciliœmy na przedstawienie ró¿nych sposobów odczytu izapisu plików.Wbrew pozorom jest to zawsze bardzo wa¿ny element aplikacjikomunikacyjnej, gdy¿ zajmuj¹c siê szeroko rozumianym sterowaniem czykomunikacj¹ komputerow¹, prêdzej czy póŸniej nale¿y liczyæ siê z koniecznoœci¹obs³ugi wysy³anych lub otrzymywanych zbiorów danych.Bardzo czêsto zachodzi te¿potrzeba przedstawienia informacji zawartych w plikach w postaci ró¿negorodzaju wydruków.Jednak zagadnienia zwi¹zane z obs³ug¹ drukarek w aplikacjachpisanych w Delphi lub C++Builderze znacznie wykraczaj¹ poza ramy tej ksi¹¿ki.Timer w DelphiSposób wykorzystania w³aœciwoœci komponentu TTimer w Object Pascalu nie ró¿nisiê w istocie od tego, co zaprezentowaliœmy wczeœniej.Niemniej jednak omówimyobecnie nieco dok³adniej pewne aspekty wykorzystywania Timera w programachpomiarowych.zaprezentujemy jeden z mo¿liwych sposobów jego u¿ycia w aplikacjiobs³uguj¹cej pewne bardzo nowoczesne urz¹dzenie ,s³u¿¹ce do stabilizacji iodczytu temperatury.Jest to najnowsza odmiana rodziny mierników, za pomoc¹których testowa³em poprzednie programy.Obs³uga tego konkretnego modelu wymagastosowania w po³¹czeniu jedynie linii TxD, RxD oraz przewodu masy.Koniecwysy³anych przez siebie danych znaczy on par¹ znaków CR LF.Wygl¹d dzia³aj¹cejaplikacji pokazano na rysunku 5.19, zaœ jej projekt dostêpny jest w katalogu\KODY\DELPHI\RS_18\p_RS_18.dpr.Odczytywana temperatura (w stopniach Kelvina)wyœwietlana jest w obiekcie edycji TRichEdit.Przy pomocy komponentu TTrackBarmo¿na prawie p³ynnie ustalaæ czêstoœæ odczytu wskazañ przyrz¹du.Komponent tenuczyni³em zdolnym do generowania zdarzenia TrackBar1Change(), tak jak pokazujeto wydruk 5.16.Wykorzystane przeze mnie w³aœciwoœci TTrackBar umo¿liwiaj¹wykonanie w trakcie pomiaru p³ynnej synchronizacji generowanych przez aplikacjêzdarzeñ ze zdarzeniami generowanymi przez miernik.Dziêki procedurze obs³ugizdarzenia TimerONClick() skojarzonego z przyciskiem Rozpocznij pomiaruaktywniamy obs³ugê zdarzenia TimerOnTimer(), gdzie dokonuje siê w³aœciwyodczyt temperatury.Zauwa¿my, ¿e dziêki zastosowaniu instrukcji Repeat.Untilproces wysy³ania zapytania bêdzie powtarzany, a¿ do momentu wys³ania ostatniegoznaku z bufora wyjœciowego.Nie ma tu ¿adnych instrukcji opóŸniaj¹cych typuSleep()! Jest jeszcze jedna, bardzo wa¿na zaleta takiej konstrukcji czêœcialgorytmu wysy³aj¹cego dane — nie musimy przy nadawaniu zbytnio przejmowaæ siêznacznikiem koñca danych CR LF.Rysunek 5.19.Wygl¹d formularza projektu p_RS_18.dprWydruk 5.16.Kod modu³u RS_18.pas aplikacji wykorzystuj¹cej komponent TTimerunit RS_18;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, ComCtrls, ExtCtrls;typeTForm1 = class(TForm)CloseComm: TButton;CheckBox1: TCheckBox;CheckBox2: TCheckBox;OpenComm: TButton;TimerON: TButton;TimerOFF: TButton;RichEdit1: TRichEdit;Timer1: TTimer;TrackBar1: TTrackBar;Edit1: TEdit;Label1: TLabel;Label2: TLabel;procedure CloseCommClick(Sender: TObject);procedure OpenCommClick(Sender: TObject);procedure TimerONClick(Sender: TObject);procedure TimerOFFClick(Sender: TObject);procedure TimerOnTimer(Sender: TObject);procedure FormCreate(Sender: TObject);procedure TrackBar1Change(Sender: TObject);private{ Private declarations }function Write_Comm(hCommDev: THANDLE;nNumberOfBytesToWrite: DWORD): Integer;function Read_Comm(hCommDev: THANDLE; Buf_Size: DWORD): Integer;public{ Public declarations }end;varForm1: TForm1;implementation{$R *
[ Pobierz całość w formacie PDF ]