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

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

Автор: mmm_home
Дата сообщения: 04.01.2012 06:36
ShIvADeSt

Цитата:
это убережет от пробелов и символов перевода каретки и тп.

но если где-то в тексте попадется 2 пустые строки, то вся конструкция работать не будет

alfaservice
раз уж четких разделителей блоков нет, то наверное лучше
if (pos('from:',LowerCase(s.Strings[j])>0 or pos('to:',LowerCase(s.Strings[j])>0) then
Автор: exteris
Дата сообщения: 04.01.2012 08:15
085
Вам в другой топик.
Автор: alfaservice
Дата сообщения: 04.01.2012 09:45
mmm_home
ShIvADeSt
Corsairs

Спасибо! Попробую... В данном случае в строке Text: находится текст смс сообщений.

И блоки действительно идут по три строки и между ними строго пустая строка одна.

From:
Date:
Text


Автор: sammozg
Дата сообщения: 06.01.2012 11:56
Люди добрые, не подскажите, а может кто и сталкивался с проблемой, почему TcpClient.Receiveln; укорачивает ответ до пустого байта, в смысле отправляется 7F FE 02 00 40 04 15 27, а приходит только 7F FE 02, просмотрел все, что только попадалось мне в Инете, нигде ничего про это не сказано.
Сразу отвечу на несколько вопросов которые могут возникнуть: В порт приходит нужное, а вот в переменную записывается укороченное, CRLF пробывал ставить разные не помогло.
Автор: Frodo_Torbins
Дата сообщения: 06.01.2012 12:26
sammozg
Код в студию.
Автор: sammozg
Дата сообщения: 06.01.2012 12:35
procedure TForm1.Button1Click(Sender: TObject);
var
m: string;
begin
TcpClient.Sendln(HexToStr(clienthex.Text));
while TcpClient.WaitForData(1000) do m:=TcpClient.Receiveln;
if m = '' then ShowMessage('нет ответа от сервера') else begin
while m<>'' do
begin
ListBoxClient.Items.Add(StrToHex(m));
label2.Caption:=m;
m:=TcpClient.Receiveln;
end;
end;
end;
Вот код клиента
Автор: vivasem
Дата сообщения: 06.01.2012 22:34
Помогите (напишите пример) с условием, нужно сделать проверку таким образом:
if a<b (но разница между а и b больше 4000000000) then begin...
Это часть функции для подсчета трафика с IPHLPAPI, дело в том что при достижении счетчика IPHLPAPI 4гб инфа обнуляется. Хочу написать счетчик циклов IPHLPAPI, но пока трафик не превысит 5мб после обнуления, счетчик циклов почемуто срабатывает.

вот ламерский кусок описаного кода:
begin
trafbitin:=Table.Table[i].dwInOctets;
trafbitout:=Table.Table[i].dwOutOctets;
iii:=0;
iii:=cardinal(Edit13.Text);
Edit16.Text:=inttostr(trafbitin);
if trafbitin<iii
then
begin
kol:=strtoint(Edit14.Text);
na:=strtoint('1');
all:=kol+na;
Edit14.Text:=inttostr(all);
Edit13.Text:=('0');
Edit13.Text:=inttostr(trafbitin);
end;
Edit2tr.Text:= ('In: '+BytesToFriendlyString(trafbitin));
Edit3tr.Text:= ('Out: '+BytesToFriendlyString(trafbitout));
Edit13.Text:=inttostr(trafbitin);
end;

а сама прога на diman.ho.ua
Автор: YuriyRR
Дата сообщения: 07.01.2012 00:10
vivasem

Цитата:
описаного кода

нет ни a ни b ни IPHLPAPI какая инфа? какой счетчик циклов?

Цитата:
больше 4000000000
ну тип данных бигинт нужно использовать 64 разряда
Автор: vivasem
Дата сообщения: 07.01.2012 01:00
Использовал глобальные переменные и изменил код, но вопрос остался открытым. Как организовать следующее?:
if trafbitin<iii (но разница между trafbitin и iii больше 2000000000) then begin
Думаю сам не разберусь.
Автор: Frodo_Torbins
Дата сообщения: 07.01.2012 10:43
vivasem
Меня вот приколола эта строчка кода:
iii:=cardinal(Edit13.Text);
Что она должна делать? Вы вообще проверяли как она работает?
По теме: if a < (b - 4000000000) then begin

sammozg
Юзайте BytesReceived и ReceiveBuf.
Автор: vivasem
Дата сообщения: 07.01.2012 13:05

Цитата:
Меня вот приколола эта строчка кода:
iii:=cardinal(Edit13.Text);
Что она должна делать? Вы вообще проверяли как она работает?

Я вообщето пишу методом научного тыка, это так неудобно:) Постоянно чегото напутаю.
Хотя в этом случае значение переменной присваивалось.
Спасибо за ответ!
Автор: Frodo_Torbins
Дата сообщения: 07.01.2012 14:03
vivasem
Цитата:
Я вообщето пишу методом научного тыка, это так неудобно Постоянно чегото напутаю.

Ну так сверяйтесь с учебниками. Благо их полно в интернете: http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1182 Или можно сразу с первоисточниками (если знаете английский): http://docwiki.embarcadero.com/RADStudio/XE2/en/Type_conversion_routines
Автор: Maks150988
Дата сообщения: 08.01.2012 21:43
vivasem
В разделе сетевых вопросов на http://delphimaster.ru/ решили проблему 4 гб поищите там.
Автор: vivasem
Дата сообщения: 08.01.2012 23:01
Да, спасибо. Я уже решил вопрос, заюзал int64. google рулит:)
И ещё одну ошибку совершал - вместо переменных использовал Edit.
Если кому скушно, можете тестонуть мою программу (показывает погоду с гисметео, есть пинг и счетчик трафика) Gismeteotray++
Автор: YuriyRR
Дата сообщения: 09.01.2012 01:10

Цитата:
Я уже решил вопрос, заюзал int64. google рулит

Все учебники начинаются с типов данных так-то.
Автор: sammozg
Дата сообщения: 09.01.2012 09:50
Frodo_Torbins
Спасибо за ответ, У меня теперь другая проблема, никак не могу разобраться с BytesReceived, TcpClient.BytesReceived всегда выдает 0..., нормального примера использования BytesReceived что-то не нашел, может подскажешь, Плиз....
Автор: Frodo_Torbins
Дата сообщения: 09.01.2012 17:33
sammozg
BytesReceived можно использовать в обработчике события OnReceive.
Что касается ReceiveBuf, то мой вариант такой: [more=Получение данных через TTcpClient]
Код: [no]//Это вешаем на TcpClient1.OnError
procedure TForm1.TcpClient1Error(Sender: TObject; SocketError: Integer);
begin
Memo1.Lines.Add('Error №' + IntToStr(SocketError)); //Или любой другой код
//отображения сообщения об ошибке
//Abort; //Если раскоментировать, то до проверки recieved ниже уже не дойдем
end;

//Получаем данные
procedure TForm1.Button1Click(Sender: TObject);
var
data: array of Byte;
recieved, need, position: Integer;
str: string;
i: Integer;
begin
need := 8; //размер данных, которые будем получать, надо знать заранее
SetLength(data, need);
position := 0;

while (need > 0) and TcpClient1.Connected do
begin
recieved := TcpClient1.ReceiveBuf(data[position], need);
if recieved = -1 then //Возникла ошибка, сюда попадем только если
Exit; //"Abort;" выше останется закоментированым

Inc(position, recieved);
Dec(need, recieved);
end;

//Далее какая то обработка полученных данных
str := '';
for i := 0 to Length(data) - 1 do
str := str + IntToHex(data[i], 2);

Memo1.Lines.Add(str);
end;[/no]
Автор: sammozg
Дата сообщения: 09.01.2012 18:56
Frodo_Torbins
Спасибо! Завтро с утра ещё разок код перелапачу, надеюь всё заработает
Автор: sammozg
Дата сообщения: 10.01.2012 10:56
Frodo_Torbins
Ещё раз спасибо за пример, я его немного расширил строчкой
len := Tcpclient.PeekBuf(buf, sizeof(buf) - 1);
здесь определили размер принимаемых данных и дальше всё как по накатанной из твоего примера, правда в отдельную функцию не выносил, компилятор ругаться начинал...
Автор: Frodo_Torbins
Дата сообщения: 10.01.2012 14:19
sammozg
Насколько я помню, tcp не гарантирует что данные отправленные одним куском придут тоже одним куском. Они могут быть разбиты на несколько частей и прийти с небольшими промежутками времени. Возможна и обратная ситуация когда несколько отдельных кусочков, на приемнике слипнутся в один. Поэтому если у вас возможны пакеты разной длинны, то перед каждым из них нужно отправлять пару байт в которых записан размер идущих далее данных. В этом случае сначала считываем эти несколько байт, а потом их содержимое записываем в переменную "need".
Автор: sammozg
Дата сообщения: 10.01.2012 18:56
Frodo_Torbins
дело в том что в качестве сервера у меня выступает контроллер КР-500(Волмаг) поэтому приходится подстраиваться под него.
Автор: RuPurple
Дата сообщения: 13.01.2012 14:11
Добрый день!
Имеется ли возможность в Delphi 7 разукрасить (изменить цвет и/или стиль) кнопки TButton и TBitBtn?
И еще, я хотел бы заменить всплывающие подсказки к этим кнопкам на Balloon Tip, т.е. чтобы при наведении указателя мышки на кнопку вместо Hint появлялся Balloon Tip. Как это можно осуществить?
Автор: Frodo_Torbins
Дата сообщения: 13.01.2012 15:09
RuPurple
С помощью различных скин-компонент типа AlphaControls.
Автор: delover
Дата сообщения: 17.01.2012 12:13
Здравствуйте, ALL!

У меня вопрос на удачу, может мне повезёт если кто ответит. В одной программе замечено странное поведение (Delphi7). Я написал программу которая использует драйвер сделанный OLE объектом. Программа не использует нестандартных компонентов и библиотек, по этому она работает корректно. Но когда мы подключаем драйвер в основном приложении то оно (приложение) остаётся "зависшим". То есть остаётся в списке процессов, приходится убивать. Это происходит только тогда когда был вызов CreateOleObject. Если вызова не было программа нормально сваливает. Сам объект я выключаю даже принудительно кнопкой перед выходом, о чём свидетельствует список процессов - драйвер уничтожается корректно и OLE объект исчезает корректно. Какие будут соображения? Может кто уже сталкивался с подобными эффектами? При этом даже

Код:
..
Application.Run;
Halt(0);
end.
Автор: rrromano
Дата сообщения: 17.01.2012 16:03
obj := UnAssigned; - это делаете? Немного бы кода посмотреть...
Автор: wasilissk
Дата сообщения: 17.01.2012 16:11
delover
CoUnInitialize вызывается не в области видимости ole переменной?
Если нет, то вижу решение только в юз дебаг дцу и перетирание всех потоков.
Автор: delover
Дата сообщения: 19.01.2012 08:11
Да и унасигнед присваивается. После этого из систрея убирается иконка драйвера и исчезает драйвер из списка процессов. И CoUninitialize под отладчиком происходит. Но потом гдето попадает в цикл. Под отладчиком CPU после паузы не могу найти место где приложение циклится.

[more=Вот немного кода]
Код: [no]
procedure DevDeactivate(Device: TDevice);
begin
if VarIsNull(fPDX) then Exit;
try
if DeviceEnabled then
fPDX.DeviceEnabled := False;
DeviceEnabled := fPDX.DeviceEnabled;
finally
fPDX := NULL; //Сдесь и Unassigned присваивал
end;
end;

initialization
fPDX := NULL;

NeedToUninitialize := Succeeded(CoInitialize(nil));
finalization
if NeedToUninitialize then CoUninitialize;

//принудительное завершение
with Application do
begin
if Handle <> 0 then ShowOwnedPopups(Handle, False);
ShowHint := False;
Destroying;
DestroyComponents;
end;

//удаление процесса killtask
TermProcess(ParamStr(0));

end.[/no]
Автор: Maks150988
Дата сообщения: 20.01.2012 17:37
Доброго времени суток. Пишу приложение с плагинами. Собственно выскакивает AV.

Код плагина:


Код: library Plugin;

uses
Windows, SysUtils;

type
PPLUGIN_TEST = ^PLUGIN_TEST;
PLUGIN_TEST = record
test: DWORD;
end;

function PluginInit(var pt: PLUGIN_TEST): BOOL; stdcall;
begin
MessageBox(GetActiveWindow, LPCSTR('Hello From PlugIn!'), nil, MB_ICONSTOP);
Result := TRUE;
pt.test := 777;
MessageBox(GetActiveWindow, LPCSTR(IntToStr(pt.test)), nil, MB_ICONSTOP);
end;

exports
PluginInit index 1;

begin
end.
Автор: wasilissk
Дата сообщения: 20.01.2012 19:09
В клиентском приложении PLUGIN_TEST какое определение имеет?
Вообще создается впечатление, что вы для выкладки на форуме очень щедро и невнимательно как-то сократили код. Например ваш клиентский код приложения где вообще написан? В модеуле .dpr?

Добавлено:
delover
Попробуйте перенести CoInitialize/CoUninitialize из секций инициализации в область видимости ole-переменной. Типа такого

Код:
procedure DoSmth
begin
...
CoInitialize;
try
oOle := CreateOle;
....
finally
CoUninitialize;
end;
end;
Автор: Frodo_Torbins
Дата сообщения: 20.01.2012 19:44
Maks150988
Попробуйте packed record. Вполне возможно, что дело в выравнивании.

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374

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


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