Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Delphi (до версии 2009) - часть 6

Автор: wasilissk
Дата сообщения: 16.02.2012 04:56
vetal71
Item это свойство c сеттером?
Components это свойство с геттером?
Просто встаньте на проблеммную строчку и нажмите F7...
Автор: vetal71
Дата сообщения: 16.02.2012 08:05
akaGM
Вопрос решен. Дело в том, что этот кусок кода был частью процедуры в процедуре, т.е.
procedure TForm1.ffff;
procedure gggg;
begin
// Мой код
end;
begin
....
end;

вынес в отдельную процедуру и заработало
Автор: salexn1
Дата сообщения: 16.02.2012 08:37
vetal71
Только мне кажется вы так и не поняли в чем была беда...
Автор: akaGM
Дата сообщения: 16.02.2012 11:35
vetal71

Цитата:
akaGM
ну чудес не бывает...
мы же не знаем, что и где у тебя происходит _до_
Автор: sammozg
Дата сообщения: 16.02.2012 11:43
Люди добрые помогите плиз, уже 2 недели ищу косяк в проге, дело в TCPClient? Сначало тупо бесконечный цикл с ошибкой ломала(выставляло true в False), теперь вообще непонятно что делает, при запуске потока всё работает как надо, работает тока не долго(когда 100 циклов, когда 10000) потом притормаживает(как-будто клиент не отвечает) затем срывается и тупо нечего не отсылает и не принимает(а циклы крутит как будто ответ уже пришол, т.е. за секунду несколько тысяч пробигает....[more=Исходник на делфи7 тут]
unit KRRead;

interface

uses
Classes, SysUtils, Sockets, ExtCtrls, Windows, Messages, Variants, Graphics, Controls, Forms,
Dialogs;

type
Work = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end;


Type
Buf = array [0..511] of byte;
PBuf = ^Buf;
function crc8 (Start, UsDataLen: integer; Mes: array of byte): byte;
var
Client1: TTCPClient;
InputARMData: buf;
KRData: buf;
KRDataQueryByf: Buf;
buffer: buf;
KRReadWrite, Rezerv: Boolean;


implementation
uses SKRSeting, SKR, ARMIO, SKRServer, SKRWork, data;

{ Important: Methods and properties of objects in visual components can only be
used in a method called using Synchronize, for example,

Synchronize(UpdateCaption);

and UpdateCaption could look like,

procedure Work.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }

{ Work }

procedure Work.Execute;
var
KolParNastr14DOst, KolParNastr14AOst, KolParNastr14A, KolParNastrA, k, j: integer;
KR, Param, i, ii, LenSav, LenRec, KolParNastrD, KolParNastr14D: Integer;
A: Byte;
ELOKR, L, M, N, P, KolOKR4, KolOKR4Ost, TimeOut: Integer;
S: boolean;
begin
KR:=SKR.KRNum;
data.Potok.KRWork[KR]:=true;
KRReadWrite:=True; //''1''
Client1:=TTcpClient.Create(Nil);
If data.Potok.KRRezerv[KR] then begin
Client1.RemoteHost:=SKRSeting.KRSet.KR[KR].RezIP;
Client1.RemotePort:=SKRSeting.KRSet.KR[KR].RezPort;
TimeOut:=StrToInt(SKRSeting.KRSet.KR[KR].RezTimeOut);
end else begin
Client1.RemoteHost:=SKRSeting.KRSet.KR[KR].IP;
Client1.RemotePort:=SKRSeting.KRSet.KR[KR].Port;
TimeOut:=StrToInt(SKRSeting.KRSet.KR[KR].TimeOut);
end;
Client1.Active:=True;
While KRReadWrite do
begin
KRDataQueryByf[$00]:=KR;
KRDataQueryByf[$01]:=$00;
KRDataQueryByf[$04]:=$40;
KRDataQueryByf[$05]:=$01;
KRDataQueryByf[$06]:=$00; // Чтение ИНР
for Param:=0 to strtoint(SKRseting.KRSet.KR[KR].INRKol)-1 do begin //поочерёдно читаем все ИНР //''3''
KRDataQueryByf[$07]:=Param;
KRDataQueryByf[$02]:=$03; //Количество байт
KRDataQueryByf[$03]:=$00; //отправляемых
KRDataQueryByf[$08]:=crc8(0,8,KRDataQueryByf); //Считаем CRC
LenSav:=8+4*strtoint(SKRseting.KRSet.KR[KR].INR[Param+1]); //Считаем сколько должно придти
LenRec:=LenSav;
i:=0; //Сохраняем резервную копию(чтоб второй раз не считать)
Client1.SendBuf(KRDataQueryByf[$00], 9); //Отправляем данные
While Client1.WaitForData(TimeOut) do //Теперь ждём данных
begin
ii:=Client1.ReceiveBuf(buffer[i],lenSav); //получаем данные
if ii>0 then i:=i+ii; //''4''
If LenRec=i then break;
end; //''-4''
i:=CRC8 (0,LenRec-1,buffer); //Считаем CRC
If buffer[LenRec-1]=i then //Проверяем CRC //''4''
begin
If (buffer[4] and $02)=1 then Rezerv:=true;
for i:=0 to 4*strtoint(SKRSeting.KRSet.KR[KR].INR[Param+1]) do
Begin //''5''
A:=Buffer[i+7];
Data.KRData[KR].INR[Param].INRIO[i]:=A; //''-5''
end; //''-4''
end; //''-3''
end;//Закончили читать ИНР
// Чтение Параметров настройки
//********************
KolParNastrA:=strtoint(SKRseting.KRSet.KR[KR].AIKol);
k:=0;
If KolParNastrA>0 then //Читаем AI
begin //''3''
KolParNastr14A:=KolParNastrA div 14;
KolParNastr14AOst:=KolParNastrA mod 14;
KRDataQueryByf[$06]:=$01;
for Param:=1 to KolParNastr14A do begin //поочерёдно читаем параметры пакетами по 14 штук //''4''
KRDataQueryByf[$07]:=$0E;
KRDataQueryByf[$02]:=$2D; //Количество байт
KRDataQueryByf[$03]:=$00; //отправляемых
for j:=1 to 14 do
begin //''5''
KRDataQueryByf[j*3+5]:=(strtoint(SKRseting.KRSet.KR[KR].AI[14*k+j,1]) and $FF); //начало номера алгоблока
KRDataQueryByf[j*3+6]:=(strtoint(SKRseting.KRSet.KR[KR].AI[14*k+j,1]) shr 8); //конец номера алгоблока
KRDataQueryByf[j*3+7]:=strtoint(SKRseting.KRSet.KR[KR].AI[14*k+j,2]); //номер входа алгоблока
end; //''-5''
KRDataQueryByf[$32]:=crc8(0,49,KRDataQueryByf); //Считаем CRC
LenSav:=$79; //Считаем сколько должно придти
LenRec:=LenSav;
i:=0; //Сохраняем резервную копию(чтоб второй раз не считать)
Client1.SendBuf(KRDataQueryByf[$00], $33); //Отправляем данные
While Client1.WaitForData(TimeOut) do //Теперь ждём данных
begin //''5''
ii:=Client1.ReceiveBuf(buffer[i],lenSav); //получаем данные
if ii>0 then i:=i+ii;
If LenRec=i then break;
end; //''-5''
i:=CRC8 (0,$78,buffer); //Считаем CRC
If buffer[$78]=i then //Проверяем CRC
begin
If (buffer[4] and $02)=1 then Rezerv:=true; //''5''
for i:=0 to 111 do
Begin //''6''
A:=Buffer[i+8];
Data.KRData[KR].AI[i+k*112]:=A;
end; //''-6''
end;
end; //''-4''
end; //Закончили читать ПАкеты AI
//*****************
If KolParNastr14Aost>0 then
begin //''4''
KRDataQueryByf[$07]:=KolParNastr14Aost;
KRDataQueryByf[$02]:=KolParNastr14Aost*3+3; //Количество байт
KRDataQueryByf[$03]:=$00; //отправляемых
KRDataQueryByf[$06]:=$01;
for j:=1 to KolParNastr14Aost do
begin //''5''
KRDataQueryByf[j*3+5]:=(strtoint(SKRseting.KRSet.KR[KR].AI[14*k+j,1]) and $FF); //начало номера алгоблока
KRDataQueryByf[j*3+6]:=(strtoint(SKRseting.KRSet.KR[KR].AI[14*k+j,1]) shr 8); //конец номера алгоблока
KRDataQueryByf[j*3+7]:=strtoint(SKRseting.KRSet.KR[KR].AI[14*k+j,2]); //номер входа алгоблока
end; //''-5''
KRDataQueryByf[KolParNastr14Aost*3+8]:=crc8(0,KolParNastr14Aost*3+8,KRDataQueryByf); //Считаем CRC
LenSav:=KolParNastr14Aost*8+9; //Считаем сколько должно придти
LenRec:=LenSav;
i:=0; //Сохраняем резервную копию(чтоб второй раз не считать)
Client1.SendBuf(KRDataQueryByf[$00], KolParNastr14Aost*3+9); //Отправляем данные
While Client1.WaitForData(TimeOut) do //Теперь ждём данных
begin //''5''
ii:=Client1.ReceiveBuf(buffer[i],lenSav); //получаем данные
if ii>0 then i:=i+ii;
If LenRec=i then break;
end; //''-5''
i:=CRC8 (0,LenRec-1,buffer); //Считаем CRC
If buffer[LenRec-1]=i then //Проверяем CRC
begin //''5''
for i:=0 to KolParNastr14Aost*8 do
Begin
If (buffer[4] and $02)=1 then Rezerv:=true; //''6''
A:=Buffer[i+8];
Data.KRData[KR].AI[i+k*112]:=A;
end; //''-6''
end ;
end; //Закончили читать остатки AI
If StrToInt(SKRSeting.KRSet.KR[KR].OKRKol)>0 then
begin
L:=1;
M:=0;
KolOKR4:=StrToInt(SKRSeting.KRSet.KR[KR].OKRKol) div 4;
KolOKR4Ost:=StrToInt(SKRSeting.KRSet.KR[KR].OKRKol) mod 4;
For ELOKR:=1 to KolOKR4 do
begin
KRDataQueryByf[$02]:=$07; //Количество байт
KRDataQueryByf[$03]:=$00; //отправляемых
KRDataQueryByf[$05]:=$01;
KRDataQueryByf[$06]:=$02;
KRDataQueryByf[$07]:=$04;
KRDataQueryByf[$08]:=L;
KRDataQueryByf[$09]:=L+1;
KRDataQueryByf[$0A]:=L+2;
KRDataQueryByf[$0B]:=L+3;
L:=L+4;
KRDataQueryByf[$0C]:=crc8(0,$0C,KRDataQueryByf);
LenSav:=$65; //Считаем сколько должно придти
LenRec:=LenSav; //Сохраняем резервную копию(чтоб второй раз не считать)
i:=0;
Client1.SendBuf(KRDataQueryByf[$00], $0D); //Отправляем данные
While Client1.WaitForData(TimeOut) do //Теперь ждём данных
begin //''5''
ii:=Client1.ReceiveBuf(buffer[i],lenSav); //получаем данные
if ii>0 then i:=i+ii;
If i=LenRec then break;
end; //''-5''
i:=CRC8 (0,LenRec-1,buffer); //Считаем CRC
If buffer[LenRec-1]=i then //Проверяем CRC
begin
If (buffer[4] and $02)=1 then Rezerv:=true; //''5''
for i:=0 to 23*4-1 do
Begin //''6''
A:=Buffer[i+8];
Data.KRData[KR].OKR[i+M*$5c]:=A;
end;
M:=M+1; //''-6''
end;
End;
If KolOKR4Ost>0 then
begin
KRDataQueryByf[$02]:=KolOKR4Ost+3; //Количество байт
KRDataQueryByf[$03]:=$00; //отправляемых
KRDataQueryByf[$05]:=$01;
KRDataQueryByf[$06]:=$02;
KRDataQueryByf[$07]:=KolOKR4Ost;
For i:=0 to KolOKR4Ost do
begin
KRDataQueryByf[i+8]:=L+i;
end;
KRDataQueryByf[KolOKR4Ost+8]:=crc8(0,KolOKR4Ost+8,KRDataQueryByf);
LenSav:=23*KolOKR4Ost+9; //Считаем сколько должно придти
LenRec:=LenSav; //Сохраняем резервную копию(чтоб второй раз не считать)
i:=0;
Client1.SendBuf(KRDataQueryByf[$00], KolOKR4Ost+9); //Отправляем данные
While Client1.WaitForData(TimeOut) do //Теперь ждём данных
begin //''5''
ii:=Client1.ReceiveBuf(buffer[i],lenSav); //получаем данные
if ii>0 then i:=i+ii;
If i=LenRec then break;
end; //''-5''
i:=CRC8 (0,LenRec-1,buffer); //Считаем CRC
If buffer[LenRec-1]=i then //Проверяем CRC
begin
If (buffer[4] and $02)=1 then Rezerv:=true; //''5''
for i:=0 to 23*KolOKR4Ost-1 do
Begin //''6''
A:=Buffer[i+8];
Data.KRData[KR].OKR[i+M*$5c]:=A;
end; //''-6''
end;
End;
End;
//******************************


KolParNastrA:=strtoint(SKRseting.KRSet.KR[KR].AOKol);
k:=0;
If KolParNastrA>0 then //Читаем A0
begin //''3''
KolParNastr14A:=KolParNastrA div 14;
KolParNastr14AOst:=KolParNastrA mod 14;
KRDataQueryByf[$06]:=$04;
for Param:=1 to KolParNastr14A do begin //поочерёдно читаем параметры пакетами по 14 штук //''4''
KRDataQueryByf[$07]:=$0E;
KRDataQueryByf[$02]:=$2D; //Количество байт
KRDataQueryByf[$03]:=$00; //отправляемых
for j:=1 to 14 do
begin //''5''
KRDataQueryByf[j*3+5]:=(strtoint(SKRseting.KRSet.KR[KR].AO[14*k+j,1]) and $FF); //начало номера алгоблока
KRDataQueryByf[j*3+6]:=(strtoint(SKRseting.KRSet.KR[KR].AO[14*k+j,1]) shr 8); //конец номера алгоблока
KRDataQueryByf[j*3+7]:=strtoint(SKRseting.KRSet.KR[KR].AO[14*k+j,2]); //номер входа алгоблока
end; //''-5''
k:=k+1;
KRDataQueryByf[$32]:=crc8(0,49,KRDataQueryByf); //Считаем CRC
LenSav:=$79; //Считаем сколько должно придти
LenRec:=LenSav;
i:=0; //Сохраняем резервную копию(чтоб второй раз не считать)
Client1.SendBuf(KRDataQueryByf[$00], $33); //Отправляем данные
While Client1.WaitForData(TimeOut) do //Теперь ждём данных
begin //''5''
ii:=Client1.ReceiveBuf(buffer[i],lenSav); //получаем данные
if ii>0 then i:=i+ii;
If i=LenRec then break;
end; //''-5''
i:=CRC8 (0,$78,buffer); //Считаем CRC
If buffer[$78]=i then //Проверяем CRC
begin
If (buffer[4] and $02)=1 then Rezerv:=true; //''5''
for i:=0 to 111 do
Begin //''6''
A:=Buffer[i+8];
Data.KRData[KR].AO[i+k*112]:=A;
end; //''-6''
end;
end; //''-4''
end; //Закончили читать ПАкеты AO
//*****************
If KolParNastr14Aost>0 then
begin //''4''
KRDataQueryByf[$07]:=KolParNastr14Aost;
KRDataQueryByf[$02]:=KolParNastr14Aost*3+3; //Количество байт
KRDataQueryByf[$03]:=$00; //отправляемых
KRDataQueryByf[$06]:=$04;
for j:=1 to KolParNastr14Aost do
begin //''5''
KRDataQueryByf[j*3+5]:=(strtoint(SKRseting.KRSet.KR[KR].AO[14*k+j,1]) and $FF); //начало номера алгоблока
KRDataQueryByf[j*3+6]:=(strtoint(SKRseting.KRSet.KR[KR].AO[14*k+j,1]) shr 8); //конец номера алгоблока
KRDataQueryByf[j*3+7]:=strtoint(SKRseting.KRSet.KR[KR].AO[14*k+j,2]); //номер входа алгоблока
end; //''-5''
k:=k+1;
KRDataQueryByf[KolParNastr14Aost*3+8]:=crc8(0,KolParNastr14Aost*3+8,KRDataQueryByf); //Считаем CRC
LenSav:=KolParNastr14Aost*8+9; //Считаем сколько должно придти
LenRec:=LenSav;
i:=0; //Сохраняем резервную копию(чтоб второй раз не считать)
Client1.SendBuf(KRDataQueryByf[$00], KolParNastr14Aost*3+9); //Отправляем данные
While Client1.WaitForData(TimeOut) do //Теперь ждём данных
begin //''5''
ii:=Client1.ReceiveBuf(buffer[i],lenSav); //получаем данные
if ii>0 then i:=i+ii;
If i=LenRec then break;
end; //''-5''
i:=CRC8 (0,LenRec-1,buffer); //Считаем CRC
If buffer[LenRec-1]=i then //Проверяем CRC
begin //''5''
for i:=0 to KolParNastr14Aost*8 do
Begin
If (buffer[4] and $02)=1 then Rezerv:=true; //''6''
A:=Buffer[i+8];
Data.KRData[KR].AO[i+k*112]:=A;
end; //''-6''
end; //''-5''
end; //Закончили читать остатки AO




//*****************************

If Data.KRData[KR].KolCom>0 Then
Begin
s:=True;
While s do begin
if Data.KRData[KR].Flag then sleep(1) else begin
Data.KRData[KR].Flag:=True;
For P:=0 to Data.KRData[KR].KolCom-1 do begin
For N:=0 to Data.KRData[KR].COM[P,2]+6 do KRDataQueryByf[n]:=Data.KRData[KR].COM[P,n];
LenSav:=$0A; //Считаем сколько должно придти
LenRec:=LenSav;
i:=0; //Сохраняем резервную копию(чтоб второй раз не считать)
Client1.SendBuf(KRDataQueryByf[$00], $0F); //Отправляем данные
While Client1.WaitForData(TimeOut) do //Теперь ждём данных
begin //''5''
ii:=Client1.ReceiveBuf(buffer[i],lenSav); //получаем данные
if ii>0 then i:=i+ii;
If i=LenRec then break;
end; //''-5''
i:=CRC8 (0,LenRec-1,buffer); //Считаем CRC
If (buffer[LenRec-1]<>i) or (Buffer[$07]+Buffer[$08]<>0) then //Проверяем CRC и ответ
begin
If (buffer[4] and $02)=1 then Rezerv:=true; //''5''
Form1.Label1.Caption:='Ошибка отправки данных в контроллер';
Client1.Active:=False;
Client1.Active:=True;
end; //''6''
Data.KRData[KR].KolCom:=$00;
end; //' to '-6''
Data.KRData[KR].Flag:=False;
s:=False;
end;
end;
end;

//*****************************

TimeKolIter:=TimeKolIter+1;
Form1.Label3.Caption:=IntToStr(TimeKolIter);
If Rezerv then begin
data.Potok.KRRezerv[KR]:=true;
break;
end;
if not KRReadWrite then break;
end; //Повтор
data.Potok.KRWork[KR]:=false;
Client1.Active:=false; //''-3''
Client1.Destroy;
end; //''-2''

function crc8 (Start, UsDataLen: integer; Mes: array of byte): byte;
var
i:word;
CR : cardinal;
begin
CR:=0;
for i:=Start to UsDataLen-1 do
begin
CR:=CR+Mes[i];
CR:= (CR and $FF) + (CR shr 8);
end;
CR:=(CR and $FF) + (CR shr 8);
CR:= not CR + $01;
CRC8:=CR and $FF;
end;

end.
[/more].
Может кто сталкивался с подобным, или хотя-бы где-нить читал, направте на путь истенный
Автор: jr13ster
Дата сообщения: 16.02.2012 20:25
akaGM

Цитата:
вариант Frodo_Torbins с изменённым методом компилируется/собирается/запускается, а замена в коде комментария требует переустановки Дельфей?

Ну так Frodo_Torbins сам правил код и компилировал, а я только тупо скопипастил да и всё.

Цитата:
используй "Courier New"...

Frodo_Torbins

Цитата:
Все дело в типе шрифта. Установите какой-нибудь из моноширинных.

А вот это реально помагло! Вот скрин. Любо-дорого смотреть!!!

Спасибо вам огромное за участие и помощь! Отдельная благодарность - Frodo_Torbins !!!

Автор: akaGM
Дата сообщения: 16.02.2012 22:01
jr13ster

Цитата:
а я только тупо скопипастил да и всё
ну да, ну да...
главное, что памагло...
Автор: Frodo_Torbins
Дата сообщения: 17.02.2012 10:26
jr13ster
Рад был помочь

sammozg
У вас довольно много кода, к тому же он весь зависит от обмена данными с неизвестным внешним клиентом. Так что только общие рекомендации: проверить BlockMode, с формой работать через Synchronize, понаставить всюду вызовов OutputDebugString.
Автор: delover
Дата сообщения: 17.02.2012 14:22
Frodo_Torbins
Привет. Я скоммитил vdbi на тот SVN. Теперь нормально можно в свнке поработать. Подготовил проектик для конвертации базы на случай изменения формата файла. Выложил базу worldcitiespop (2797245 населённых пунктов с координатами). Там open в потоке, по этому проект запускается быстро, пока смотришь на гридину с первыми 1000 данных он докачивается. Есть формулы расчёта расстояний думаю доделать и привинтить.
Автор: delover
Дата сообщения: 18.02.2012 08:32
Frodo_Torbins
Базу городов выкладываю отдельно она 200мб и по SVN качать не реально.
Автор: Simkara
Дата сообщения: 18.02.2012 15:05
В программе нужно сделать окошко, в котором рандомится и выводится пользователю - число в диапазоне [11..25].
В Form1 вставил Edit1, в его свойствах, через редактор прописал следующее:


Цитата:

procedure TForm1.Edit1Change(Sender: TObject);
var b:integer;
begin
randomize;
b:=random(15)+11;
Edit1.Text:=FloatToStr(b);
end;


Но число не выводится при запуске программы. Приходится сначала тыкнуть на окошко, и нажать на любую кнопку, только тогда срабатывает рандом и в окне появляется случайное число в заданном диапазоне.

Собственно вопрос, как сделать, что бы число выводилось сразу же, после запуска программы?
Автор: akaGM
Дата сообщения: 18.02.2012 16:10
Simkara
1) randomize
надо вызывать в _самом начале_ программы, хоть в самом .dpr

2) попробуй
b:=random(15)+11;
Edit1.Text:=FloatToStr(b);

вызвать в методе формы FormCreate(), ну или в самом конструкторе Edit1'a
Автор: Mantikor123
Дата сообщения: 19.02.2012 10:51
Есть задание сымитировать роботу очереди процессов, изначально планировалось в ассемблере но потом сказали в делфи...
Теперь собственно вопрос как можно сделать процесс со временем роботы в делфи?
На ум приходят только таймеры, которые будут рандомно запускаться... ну а потом алгоритм из ifов чтоб реализовать LIFO (Last Come First Serve) - первым обслуживается последний...

Автор: Frodo_Torbins
Дата сообщения: 19.02.2012 14:07
delover
Ок, гляну.

Mantikor123
Возможно тут подойдут Fibers (нити), пример. Нити это почти те же потоки со своими стеками, но переключение между ними производится вручную, позволяя полностью управлять временем выполнения каждого из них.
Автор: Mantikor123
Дата сообщения: 19.02.2012 16:22
Frodo_Torbins
про Волокна мало что понял(( второй пример, насколько я понял просто реализует как э-то паузу, с прогресбаром. который можно использовать как процесс....
если все верно, то дело за малым, написать что в принципе не особо сложно....
Правильно ли я понял?
Благодарю за помощь
Автор: Frodo_Torbins
Дата сообщения: 19.02.2012 17:56
Mantikor123
Суть примера не в том что он делает, а как использует нити для этого. Ну да ладно, если они для вас слишком сложны, то лучше делайте теми способами, которые знаете. Вам же потом сдавать эту работу.
Автор: Mantikor123
Дата сообщения: 19.02.2012 19:09
ну разобраться можно во всем было б желание... но с таймерами как то поспокойней))
Собственно по ним теперь вопрос.
нашел такой код чтоб связать прогресбар с таймером.
ну р это понятно ProgressBar1. А вот где он связуеться с таймером я так и не понял, точней где переменная таймера.
if p.Max = p.Position
then p.Position := p.Min
else p.Position := p.Position + 1;


Да если не сложно(пока не искал и не приступал) подскажите как можно рандомно вызвать 1 из 5 процедур, чтоб все 5 были активны но в разной последовательности.


есть еще пару вопросов, но их задам если уже не выйдет после эксперимента...
Автор: Frodo_Torbins
Дата сообщения: 19.02.2012 19:19
Mantikor123
У таймеров нету счетчиков, они просто срабатывают через определенные промежутки времени. Если приложение долго было занято работой, и за это время должно было произойти несколько срабатываний таймера, то произойдет только одно, когда приложение освободится. Остальное тут: http://www.delphikingdom.com/asp/viewitem.asp?catalogid=342
Автор: Mantikor123
Дата сообщения: 19.02.2012 19:21
хм, спасибо будем разбираться....
Автор: MrZeRo
Дата сообщения: 20.02.2012 17:39
Mantikor123
Чтобы несколько процедур "были активными" (наверное, имеется в виду, чтобы они одновременно выполнялись), придется использовать потоки (Thread), тут таймерами не обойтись. Информации по многопоточному программированию уйма.
Автор: Mantikor123
Дата сообщения: 21.02.2012 07:24
Не вышло к таймеру привязать прогрес бар, по этому пришлось вот так прогресс бар сделать.

Код: procedure Pause(p:integer);
var
t:TTime;
begin
t:=EncodeTime(0,0,p,0)+Time;
repeat
Application.ProcessMessages;
Sleep(1);
until Time>=t;
end;


procedure TForm1.BitBtn1Click(Sender: TObject);
var i:Integer;
begin
for i:=0 to 10 do
begin
Application.ProcessMessages;
Pause(1);
progressbar1.Position:=i;
end;

end;
Автор: salexn1
Дата сообщения: 21.02.2012 07:28
Mantikor123
Посмотрите как это сделано в демках к делфям: ..\Demos\Threads\

Вам нужно создавать несколько потоков и уже в потоках имитировать работу процессоров.
Автор: Frodo_Torbins
Дата сообщения: 21.02.2012 12:41
Mantikor123
Я так и не понял, что конкретно требуется. В произвольном порядке двигать прогресбары? Так и зачем вам тогда Sleep, если есть таймер?
Автор: Mantikor123
Дата сообщения: 21.02.2012 12:53
salexn1, спасибо гляну.
Frodo_Torbins, ну нужно сделать визуализацию процесса с помощью прогресс бар, ну по крайней мере я так себе это представляю. Таймер к прогбару у меня так и не вышло толком подцепит((
и теперь я хочу чтоб после нажатия на кнопку, бары по определений очереди заполнялись. Я это сделал, но возник затык, когда оно выполняется(заполняются бары) то к форме изо Sleep нет доступа. Конечно пойдет и так, но хотелось бы в это время иметь возможность роботы с формой...



Хм еще одна проблемка...
Когда код в процедуре кнопки то все работает а стоит вынести ее в отдельную процедуру

Код: procedure ProgBars(Sender: TObject);
var
i:Integer;
begin
for i:=0 to 100 do
begin
Application.ProcessMessages;
Pause;
ProgressBar1.Position:=i;
end;

end;
Автор: Frodo_Torbins
Дата сообщения: 21.02.2012 15:48
Mantikor123
Я бы занес все прогресбары в массив и потом в таймере увеличивал Position какого-нибудь случайно выбранного.
С процедурой у вас два варианта:
обьявить процедуру частью формы:
Код: //...
public
procedure ProgBars(Sender: TObject);
end;
Автор: ant0ni02004
Дата сообщения: 21.02.2012 16:56
Mantikor123

нужно посылать главной форме сообщения (напр. WM_USER+...) из рабочих потоков
в параметрах передавать информацию о текущем состоянии обработки,
а в обработчике сообщения уже двигать прогресс-бары. и ничего блокироваться не будет
Автор: Mantikor123
Дата сообщения: 21.02.2012 20:17
Ура сделал. Всем спасибо за помощь....
Автор: Ichigo2
Дата сообщения: 22.02.2012 06:41
Привет всем. Вопрос по StringGrid.
Нужно сделать выделение, или правильно сказать активацию ячеек в таблице с помощью мыши, на событие onMouseMove, т.е. водишь мышкой над таблицей, и ячейки под мышкой становятся активными.
Эта фича у меня уже была, но удалил из-за ненадобностью а теперь вспомнить не могу...
Автор: salexn1
Дата сообщения: 22.02.2012 07:27
Ichigo2
var
aRow, aCol: Integer;
aRect: TGridRect;
begin
StringGrid1.MouseToCell(X, Y, ACol, aRow);
aRect.Left := ACol;
aRect.Top := aRow;
aRect.Right := ACol;
aRect.Bottom := aRow;
StringGrid1.Selection := aRect;
Автор: exteris
Дата сообщения: 22.02.2012 07:38
А в чем должна выражаться активность ячейки? Фокус?

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374

Предыдущая тема: MPO File


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.