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

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

Автор: ShIvADeSt
Дата сообщения: 29.06.2011 00:54
Maks150988

Цитата:
Я ничего тупее копирования в лоб по позициям текста с переводом в интегер для последующего переумножения не придумал.

Вам шашечки или ехать? По очереди отпарсиваете все параметры (благо все фиксированно), если смещение по часовому поясу не нужно, то нафиг, если нужно, то прибавляем (отнимаем), а потом куда надо (TDateTime, TSystemTime) загоняем и работаем. Есть куча способов (от StrToDate до всяких конверт) чтобы потом получить дату, время и тп.
Автор: Maks150988
Дата сообщения: 29.06.2011 13:22
ShIvADeSt


Код: function UniversalToDateTime(pszUSDP: AnsiString): TSystemTime;
begin
Result.wYear := StrToInt(Copy(pszUSDP, 1, 4));
Result.wMonth := StrToInt(Copy(pszUSDP, 6, 2));
Result.wDay := StrToInt(Copy(pszUSDP, 9, 2));
Result.wHour := StrToInt(Copy(pszUSDP, 12, 2));
Result.wMinute := StrToInt(Copy(pszUSDP, 15, 2));
Result.wSecond := StrToInt(Copy(pszUSDP, 18, 2));
end;
Автор: ShIvADeSt
Дата сообщения: 29.06.2011 23:02
Maks150988

Цитата:
Дальше прогоняю через SystemTimeToDateTime и сравниваю функцией DaysBetween. Может можно проще сравнить? Мне кажется тут много лишнего и наверняка без перегона в TDateTime.

Если нужно просто сравнить две даты (больше, меньше, равно) то подойдет строковое сравнение
2011-06-30 < 2011-07-01
так же можно в одну строку сравнить и время
09:44 < 10:23
поэтому просто для сравнения вообще ничего переводить не надо, сравнивайте как строки. Главное порядок должен быть ГГГГ-ММ-ДД
Автор: Maks150988
Дата сообщения: 29.06.2011 23:42
ShIvADeSt
Мне нужно узнать остаток дней до окончания тарифного плана. Через GetSystemTime узнаю текущую время и дату, теперь надо перевести в дни это значение и значение после парсиннга xml и ну и узнать разницу. Как проще?
Автор: ShIvADeSt
Дата сообщения: 30.06.2011 01:08
Maks150988

Цитата:
Мне нужно узнать остаток дней до окончания тарифного плана. Через GetSystemTime узнаю текущую время и дату, теперь надо перевести в дни это значение и значение после парсиннга xml и ну и узнать разницу. Как проще?

Напрямую никак, либо конвертация в TDateTime, либо в TFileTime. При втором случае нужно еще бубен использовать
http://forum.vingrad.ru/forum/topic-274640.html
Поэтому твой способ лучше.
Автор: Frodo_Torbins
Дата сообщения: 30.06.2011 07:14
Maks150988
Я бы использовал EncodeDateTime чтобы дальше уже ничего не конвертировать. И потом с помощью DateUtils делал вычисления.
Автор: Czechoslovak
Дата сообщения: 30.06.2011 08:36

Цитата:
Мне нужно узнать остаток дней до окончания тарифного плана. Через GetSystemTime узнаю текущую время и дату, теперь надо перевести в дни это значение и значение после парсиннга xml и ну и узнать разницу. Как проще?


И в чем тут проблема? Это то же самое что вычислить стаж? так решений в инете мама-негорюй...Парсишь дату и вычисляешь разницу....
А если тебе всего лишь количество дней так....А вообще модуль DateUtils предоставляет очень хорошие функции для твоих вечислений: YearsBetween, MonthsBetween, DaysBetween, еще пригодится DaysInYear. Все может быть гораздо проще.

В общем тут обсуждать нечего, любые решения будут по производительности приблизительно одинаковые!
Автор: ShIvADeSt
Дата сообщения: 30.06.2011 09:00
Czechoslovak

Цитата:
И в чем тут проблема? Это то же самое что вычислить стаж? так решений в инете мама-негорюй...Парсишь дату и вычисляешь разницу....
А если тебе всего лишь количество дней так....А вообще модуль DateUtils предоставляет очень хорошие функции для твоих вечислений: YearsBetween, MonthsBetween, DaysBetween, еще пригодится DaysInYear. Все может быть гораздо проще.

Чукча не читатель, чукча писатель? Он ИМЕННО ТАК И ДЕЛАЕТ. И спрашивает, есть ли другие способы, без преобразований в TDateTime.
Автор: yanus69
Дата сообщения: 05.07.2011 13:11
Есть dcu файлы, можно ли их подключить к управляемому коду или скомпилировать в управляемый код?? Версия delphi не существенная. Спасибо.
Автор: akaGM
Дата сообщения: 05.07.2011 13:56
yanus69

Цитата:
Есть dcu файлы, можно ли их подключить к управляемому коду или скомпилировать в управляемый код??

*.dcu и так "скомпилированные" бинарники, можешь прояснить что ты хочешь конкретно?
хотя ответ очевиден:

имеющиеся dcu можно подключить и использовать только с той версией дельфей, которой они были созданы, больше с ними ничего сделать нельзя...
ну только если не учитывать дизассм...
Автор: yanus69
Дата сообщения: 05.07.2011 16:15
akaGM
Спасибо. Уже сам понял.
Автор: akaGM
Дата сообщения: 05.07.2011 16:26
yanus69
не за что, Виталий,
ю а велком...
Автор: Maks150988
Дата сообщения: 08.07.2011 21:56
Происходит что-то непонятное, по крайней мере для меня. Использую Delphi 7. Есть следующий код:


Код: function SendSoapRequest(hResourceHandle: HINTERNET; pszSoap: Utf8String): AnsiString;
var
dwStatus : DWORD;
dwStatusSize : DWORD;
dwReserved : DWORD;
bRet : Boolean;
pszText : Utf8String;
dwBytesToWrite: DWORD;
dwBytesRead : DWORD;
begin

Result := '';

bRet := HttpSendRequest(hResourceHandle, nil, 0, LPTSTR(pszSoap), lstrlen(LPTSTR(pszSoap)));
if bRet then
begin

dwStatus := 0;
dwStatusSize := SizeOf(dwStatus);
dwReserved := 0;
bRet := HttpQueryInfo(
hResourceHandle,
HTTP_QUERY_FLAG_NUMBER or HTTP_QUERY_STATUS_CODE,
@dwStatus,
dwStatusSize,
dwReserved
);

if (bRet and (dwStatus = HTTP_STATUS_OK)) then
begin

bRet := InternetQueryDataAvailable(hResourceHandle, dwBytesToWrite, 0, 0);
if (bRet and (dwBytesToWrite > 0)) then
begin

SetLength(pszText, dwBytesToWrite);

repeat
bRet := InternetReadFile(hResourceHandle, LPTSTR(pszText), dwBytesToWrite, dwBytesRead);
if (bRet and (dwBytesRead > 0)) then
begin

SetLength(pszText, dwBytesRead);
Result := Result + Utf8ToAnsi(pszText);

end;

until
dwBytesRead = 0;

end;

end;

end;

end;
Автор: Frodo_Torbins
Дата сообщения: 08.07.2011 22:08
Maks150988
В системном модуле подобный косяк очень маловероятен. Скорее всего ваш код затирает данные менеджера памяти. Советы стандартные:включить отладочные опции компилятора;
заменить менеджер памяти отладочным;
вырезать из проекта все лишнее, пока не останется минимум кода, приводящий к ошибке.
Автор: Maks150988
Дата сообщения: 08.07.2011 22:38
Frodo_Torbins
[more=Код]


Код: unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, WinInet;

type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure RadioButton1Click(Sender: TObject);
procedure RadioButton2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

type
TBillingInfo = packed record
realmID : Integer;
sessionID : AnsiString;
userIP : AnsiString;
cardName : AnsiString;
subscrName : AnsiString;
balanceMoney: Double;
balanceDraft: Double;
tarifName : AnsiString;
daysLeft : Integer;
end;

implementation

{$R *.dfm}

function ExtractSubString(TextSource, TextBefore, TextAfter: AnsiString): AnsiString;
var
UcStr : AnsiString;
UcBefore : AnsiString;
UcAfter : AnsiString;
SrcLen : Integer;
BeforeLen : Integer;
AfterLen : Integer;
StartPos : Integer;
EndPos : Integer;
Searching : Boolean;
begin
Result := '';
UcStr := LowerCase(TextSource);
UcBefore := LowerCase(TextBefore);
UcAfter := Lowercase(TextAfter);
SrcLen := Length(UcStr);
BeforeLen := Length(UcBefore);
AfterLen := Length(UcAfter);
StartPos := Pos(UcBefore, UcStr);
if (StartPos = 0) then
Exit;
StartPos := StartPos + BeforeLen;
EndPos := StartPos;
Searching := EndPos <= SrcLen;
while Searching do
begin
if (Copy(UcStr, EndPos, AfterLen) = UcAfter) then
Result := Copy(TextSource, StartPos, EndPos - StartPos);
if (Result <> '') then
Searching := FALSE
else
begin
EndPos := EndPos + 1;
Searching := EndPos <= SrcLen;
end;
end;
end;

// Функция составляет строку SOAP запроса из шаблона.

function CreateSoapRequest(func: AnsiString; args, keys: Array of AnsiString): Utf8String;
var
dwItem : Integer;
pszTemp: AnsiString;
pszArg : AnsiString;
begin

Result :=
'<?xml version="1.0" encoding="UTF-8"?>' + sLineBreak +
'<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">' + sLineBreak +
' <soap12:Body>' + sLineBreak +
' <%func% xmlns="AIST-CARDS-USER-SERVICE">' + sLineBreak +
' %args%' + sLineBreak +
' </%func%>' + sLineBreak +
' </soap12:Body>' + sLineBreak +
'</soap12:Envelope>';

Result := StringReplace(Result, '%func%', func, [rfReplaceAll, rfIgnoreCase]);

for dwItem := Low(args) to High(args) do
begin

pszTemp := StringReplace(' <%arg%>%key%</%arg%>', '%arg%', args[dwItem], [rfReplaceAll, rfIgnoreCase]);
pszTemp := StringReplace(pszTemp, '%key%', keys[dwItem], [rfReplaceAll, rfIgnoreCase]);
pszArg := pszArg + pszTemp + sLineBreak;

end;

pszTemp := StringReplace(Result, '%args%', Trim(pszArg), [rfReplaceAll, rfIgnoreCase]);
Result := AnsiToUtf8(pszTemp);

end;

// Функция отправляет SOAP запрос на сервер и возвращает от него ответ.

function SendSoapRequest(hResourceHandle: HINTERNET; pszSoap: Utf8String): AnsiString;
var
dwStatus : DWORD;
dwStatusSize : DWORD;
dwReserved : DWORD;
bRet : Boolean;
pszText : Utf8String;
dwBytesToWrite: DWORD;
dwBytesRead : DWORD;
begin

Result := '';

bRet := HttpSendRequest(hResourceHandle, nil, 0, LPTSTR(pszSoap), lstrlen(LPTSTR(pszSoap)));
if bRet then
begin

dwStatus := 0;
dwStatusSize := SizeOf(dwStatus);
dwReserved := 0;
bRet := HttpQueryInfo(
hResourceHandle,
HTTP_QUERY_FLAG_NUMBER or HTTP_QUERY_STATUS_CODE,
@dwStatus,
dwStatusSize,
dwReserved
);

if (bRet and (dwStatus = HTTP_STATUS_OK)) then
begin

bRet := InternetQueryDataAvailable(hResourceHandle, dwBytesToWrite, 0, 0);
if (bRet and (dwBytesToWrite > 0)) then
begin

SetLength(pszText, dwBytesToWrite);

repeat
bRet := InternetReadFile(hResourceHandle, LPTSTR(pszText), dwBytesToWrite, dwBytesRead);
if (bRet and (dwBytesRead > 0)) then
begin

SetLength(pszText, dwBytesRead);
Result := Result + Utf8ToAnsi(pszText);

end;

until
dwBytesRead = 0;

end;

end;

end;

end;

// Функция извлекает подстроку из XML файла после SOAP запроса.

function GetSoapValue(pszSoap, pszKey: AnsiString): AnsiString;
var
pszval1: AnsiString;
pszval2: AnsiString;
begin

pszval1 := StringReplace('<%key%>', '%key%', pszKey, [rfReplaceAll, rfIgnoreCase]);
pszval2 := StringReplace('</%key%>', '%key%', pszKey, [rfReplaceAll, rfIgnoreCase]);

Result := ExtractSubString(pszSoap, pszval1, pszval2);

end;

procedure TForm1.Button1Click(Sender: TObject);
var
hOpenHandle : HINTERNET;
hConnectHandle : HINTERNET;
hResourceHandle: HINTERNET;
pszSoap : Utf8String;
pszTemp : AnsiString;
pszText : AnsiString;
binfo : TBillingInfo;
{
stCurrent : TSystemTime;
dtCurrent : _TDateTime;
dtChange : _TDateTime;
}
begin

ZeroMemory(@binfo, SizeOf(TBillingInfo));

hOpenHandle := InternetOpen(
nil,
INTERNET_OPEN_TYPE_PRECONFIG,
nil,
nil,
0
);
if Assigned(hOpenHandle) then
try

hConnectHandle := InternetConnect(
hOpenHandle,
LPTSTR('cardsusr.tlt.aist.net.ru'),
9001,
nil,
nil,
INTERNET_SERVICE_HTTP,
0,
0
);
if Assigned(hConnectHandle) then
try

hResourceHandle := HttpOpenRequest(
hConnectHandle,
LPTSTR('POST'),
LPTSTR('/service.asmx'),
LPTSTR(HTTP_VERSION),
nil,
nil,
INTERNET_FLAG_SECURE or INTERNET_FLAG_KEEP_CONNECTION or INTERNET_FLAG_RELOAD,
0
);
if Assigned(hResourceHandle) then
try

pszText := 'Host: cardsusr.tlt.aist.net.ru' + sLineBreak;
HttpAddRequestHeaders(hResourceHandle, LPTSTR(pszText), lstrlen(LPTSTR(pszText)), HTTP_ADDREQ_FLAG_ADD);
pszText := 'Content-Type: application/soap+xml; charset=utf-8' + sLineBreak;
HttpAddRequestHeaders(hResourceHandle, LPTSTR(pszText), lstrlen(LPTSTR(pszText)), HTTP_ADDREQ_FLAG_ADD);

// Извлекаем идентификатор услуги.

pszSoap := CreateSoapRequest('GetRealmIdByCard', ['CardName'], [Edit1.Text]);
pszText := Format('Content-Length: %d', [lstrlen(LPTSTR(pszSoap))]) + sLineBreak;
HttpAddRequestHeaders(hResourceHandle, LPTSTR(pszText), lstrlen(LPTSTR(pszText)), HTTP_ADDREQ_FLAG_ADD);

pszTemp := SendSoapRequest(hResourceHandle, pszSoap);
pszText := GetSoapValue(pszTemp, 'GetRealmIdByCardResult');
binfo.realmid := StrToIntDef(pszText, 0);

// Извлекаем идентификатор текущей сессии и IP адрес пользователя.

pszSoap := CreateSoapRequest('LoginByRealmID2', ['realmID', 'login', 'password', 'userIP'], [IntToStr(binfo.realmid), Edit1.Text, Edit2.Text, '81.28.160.1']);
pszText := Format('Content-Length: %d', [lstrlen(LPTSTR(pszSoap))]) + sLineBreak;
HttpAddRequestHeaders(hResourceHandle, LPTSTR(pszText), lstrlen(LPTSTR(pszText)), HTTP_ADDREQ_FLAG_REPLACE);

pszTemp := SendSoapRequest(hResourceHandle, pszSoap);
pszText := GetSoapValue(pszTemp, 'sessionID');
binfo.sessionID := pszText;
pszText := GetSoapValue(pszTemp, 'userIP');
binfo.userIP := pszText;

// Извлекаем сведения о биллинге пользователя.

pszSoap := CreateSoapRequest('GetCardInfo', ['sessionID', 'userIP'], [binfo.sessionID, binfo.userIP]);
pszText := Format('Content-Length: %d', [lstrlen(LPTSTR(pszSoap))]) + sLineBreak;
HttpAddRequestHeaders(hResourceHandle, LPTSTR(pszText), lstrlen(LPTSTR(pszText)), HTTP_ADDREQ_FLAG_REPLACE);

pszTemp := SendSoapRequest(hResourceHandle, pszSoap);

{
pszText := GetSoapValue(pszTemp, 'CARD_NAME');
binfo.cardName := pszText;

pszText := GetSoapValue(pszTemp, 'USER_NAME');
binfo.subscrName := pszText;

pszText := GetSoapValue(pszTemp, 'ACCOUNT_MONEY');
pszText := StringReplace(pszText, '.', ',', [rfReplaceAll, rfIgnoreCase]);
binfo.balanceMoney := StrToFloat(pszText);

pszText := GetSoapValue(pszTemp, 'ACCOUNT_OVERDRAFT');
pszText := StringReplace(pszText, '.', ',', [rfReplaceAll, rfIgnoreCase]);
binfo.balanceDraft := StrToFloat(pszText);

pszText := GetSoapValue(pszTemp, 'TARIF_PLAN_COMMENT');
binfo.tarifName := pszText;

ZeroMemory(@stCurrent, SizeOf(TSystemTime));
GetLocalTime(stCurrent);

if (binfo.realmID = 2) then
begin

pszText := GetSoapValue(pszTemp, 'TARIF_CHANGE_TIME');
dtCurrent := _SystemTimeToDateTime(stCurrent);
dtChange := UniversalTimeToDateTime(pszText);
binfo.daysLeft := _DaysBetween(dtChange, dtCurrent);

end;
}

// Завершаем текущую сессию.

pszSoap := CreateSoapRequest('LogoffResponse', ['sessionID', 'userIP'], [binfo.sessionID, binfo.userIP]);
pszText := Format('Content-Length: %d', [lstrlen(LPTSTR(pszSoap))]) + sLineBreak;
HttpAddRequestHeaders(hResourceHandle, LPTSTR(pszText), lstrlen(LPTSTR(pszText)), HTTP_ADDREQ_FLAG_REPLACE);

pszTemp := SendSoapRequest(hResourceHandle, pszSoap);

// Отображаем окончательные данные о биллинге.

{
Memo1.Text := Format('ID услуги : %d', [binfo.realmID]) + sLineBreak;
Memo1.Text := Memo1.Text + Format('ID сессии : %s', [binfo.sessionID]) + sLineBreak;
Memo1.Text := Memo1.Text + Format('IP адрес : %s', [binfo.userIP]) + sLineBreak + sLineBreak;

Memo1.Text := Memo1.Text + Format('Номер : %s', [binfo.cardName]) + sLineBreak;
Memo1.Text := Memo1.Text + Format('Имя абонента : %s', [binfo.subscrName]) + sLineBreak;
Memo1.Text := Memo1.Text + Format('Остаток (руб) : %f', [binfo.balanceMoney]) + sLineBreak;
Memo1.Text := Memo1.Text + Format('Овердрафт (руб): %f', [binfo.balanceDraft]) + sLineBreak;
Memo1.Text := Memo1.Text + Format('Тарифный план : %s', [binfo.tarifName]) + sLineBreak;
if (binfo.realmID = 2) then
Memo1.Text := Memo1.Text + Format('Осталось дней : %d', [binfo.daysLeft]) + sLineBreak;

pszText := Format('%d:%d:%d %d.%d.%d', [stCurrent.wHour, stCurrent.wMinute, stCurrent.wSecond, stCurrent.wDay, stCurrent.wMonth, stCurrent.wYear]);
Memo1.Text := Memo1.Text + sLineBreak + Format('Дата обновления: %s', [pszText]) + sLineBreak;
}

finally
InternetCloseHandle(hResourceHandle);
end;

finally
InternetCloseHandle(hConnectHandle);
end;

finally
InternetCloseHandle(hOpenHandle);
end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin

{
}

end;

procedure TForm1.RadioButton1Click(Sender: TObject);
begin

end;

procedure TForm1.RadioButton2Click(Sender: TObject);
begin

end;

end.
Автор: extasy
Дата сообщения: 11.07.2011 08:40
Maks150988
Если проблема с памятью, то можно попробовать подключить менеджер памяти FastMM и включить FullDebugMode. Может там что-нибудь увидите.

Настройку FastMM, например, можно посмотреть тут: http://www.gunsmoker.ru/2009/05/blog-post_24.html
Автор: R3Pa4eK
Дата сообщения: 11.07.2011 09:00
Как создать поток, и загрузить в него какой-нибудь файл, например картинку? И потом загружать не с файла, а с потока?
Автор: ShIvADeSt
Дата сообщения: 11.07.2011 09:14
R3Pa4eK
TFileSteam
LoadFromFile
LoadFromStream
Автор: R3Pa4eK
Дата сообщения: 11.07.2011 09:25
ShIvADeSt

Цитата:
TFileSteam

Может TFileStream? Если да, то я в нем нет функций LoadFromFile и LoadFromStream.

Добавлено:
ShIvADeSt
Смотри, имеется файл, например image.png. Мне надо его экспортировать в поток и брать этот файл с него! [more=Маленькая наработка]
library b2d;

uses
Windows, Classes,
SysUtils;

{$R *.res}

var
Str: TFileStream;

procedure ExportFileInStream(FileName: AnsiString); stdcall;
begin
Str:=TFileStream.Create(FileName, (fmOpenRead) and (fmOpenWrite));
DeleteFile(FileName);
end;

procedure LoadFromStream(FileName: AnsiString); stdcall;
begin

end;

begin
end.
[/more]
Автор: ShIvADeSt
Дата сообщения: 11.07.2011 09:52

Цитата:
Может TFileStream?

Упс, TMemoryStream.
У него есть LoadFromFile. A LoadFromStream - это уже к тому компоненту, который должен работать с потоком.
Сразу говорю - я не знаю как будет себя вести поток при вызове и передаче в библиотеку.
Автор: R3Pa4eK
Дата сообщения: 11.07.2011 10:08
ShIvADeSt
А как загрузить определённый файл с потока?
Автор: egerLESHIK
Дата сообщения: 11.07.2011 12:44
Здравствуйте, уважаемые.
Не могли бы помочь с решением одного вопроса.

Пытаюсь динамически загружать данные из файла Excel.
загружаю их в cxGrid1 через связку ADOConnection1+ADODataSet1+ADOQuery1+DataSource1,

затем путем построчного обхода строк по колонкам пытаюсь записать значения в создаваемую автоматом таблицу (таблица в бд Firebird создается без проблем).

Записать данные пытаюсь через SQL-запрос, использую связку pFIBDatabase1+pFIBDataSet1+pFIBTransaction1+pFIBQuery1+DataSource2, с последующим отображением в cxGrid2.

Часть кода программы, отвечающую за эту операцию привожу ниже:


Цитата:
With CNN_complex.Form1 do
begin
cxGrid2.Visible:=false;
cxGrid1.Visible:=true;
while k<=cxGrid1DBTableView1.DataController.RecordCount-1 do
begin
for i := 0 to cxGrid1DBTableView1.DataController.ItemCount-1 do
begin
pFIBQuery1.Close;
pFIBQuery1.Params.ParamByName(namecol).Value:=ADOQuery1.Fields[i].AsAnsiString;
pFIBQuery1.SQL.Text:='INSERT INTO KONTRA'+dft+' '+ADOQuery1.Fields[i].FieldName+'values :namecol';
pFIBQuery1.ExecQuery;
pFIBTransaction1.CommitRetaining;
end;
ADOQuery1.Next;
k:=k+1;
end;
end;


При компиляции и запуска операции по выполнению данного блока кода получаю следующую ошибку: Parameter "" does not exist in Form1.pFIBQuery1.

Быть может кто-то знает более простой путь занесения динамических данных из Excel файла в Firebird. Подскажите, пожалуйста.

Спасибо, за внимание.

Автор: extasy
Дата сообщения: 11.07.2011 13:23
R3Pa4eK

Что-то такое


Код: procedure TMainFrm.Button1Click(Sender: TObject);
var
ms: TMemoryStream;
begin
// создаем поток в памяти
ms := TMemoryStream.Create;
// загружаем в него файл
ms.LoadFromFile('C:\11.bmp');

// переходим к началу потока
ms.Seek(0, soFromBeginning);
// загружаем картинку из потока
Image1.Picture.Bitmap.LoadFromStream(ms);

// переходим к началу потока
ms.Seek(0, soFromBeginning);
// загружаем картинку из потока
Image2.Picture.Bitmap.LoadFromStream(ms);

// убираем за собой
ms.Free;
end;
Автор: Czechoslovak
Дата сообщения: 11.07.2011 15:02
egerLESHIK
По ходу надо с начало присвоить SQL запрос и определить тип , а потом устанавливать параметр.
Автор: egerLESHIK
Дата сообщения: 11.07.2011 20:37
Что-то изменил код, как советовал extasy теперь вместо параметра "" высвечивается параметр названия поля, но ошибку все равно выдает: Parameter "здесь название поля" does not exist in Form1.pFIBQuery1.

P.S. Колонка с таким названием в базе данных есть.
Автор: extasy
Дата сообщения: 12.07.2011 09:22
egerLESHIK
Незнаю какой компонент вы используете, но в UniDac и MySQL вначале параметр еще нужно создать

Что-то такое:

Код: query.Params.CreateParam(ftBlob,'p_data',ptInput);
query.ParamByName('p_data').LoadFromFile(MainFrm.OpenDialog1.FileName, ftBlob);
Автор: krapotkin
Дата сообщения: 12.07.2011 13:02
R3Pa4eK
сама идея непонятна
что значит "файл с потока" ??
В чем задача, объясни по-человечьи.

поток - TStream
работа с файлом как с потоком - TFileStream ( class(TStream) )
работа с данными в памяти как с потоком - TMemoryStream
есть еще разные готовые классы

все они свободно читают друг из друга...

например если создать TFileStream и читать из него, файл будет читаться пока не закончится:


Код: memStream1.CopyFrom(fileStream1, fileStream1.Size)
Автор: Maks150988
Дата сообщения: 12.07.2011 22:39
extasy
Поставил FastMM. Все равно толком не понял где утечки. Там есть какие-то цифры в сообщении после возникновения ошибки, если соотнести к строкам кода, то это действия с SetLength.

Переделал так, вроде не валится код, но не докачивает страницу. Работает на мелких файлах. Большой недогружает где-то 20%.

[more=Код]
Код: function SendSoapRequest(hResourceHandle: HINTERNET; pszSoap: Utf8String): AnsiString;
var
dwStatus : DWORD;
dwStatusSize : DWORD;
dwReserved : DWORD;
bRet : Boolean;
dwBytesToWrite: DWORD;
dwBytesRead : DWORD;
pszData : Pointer;
pszText : Utf8String;
begin

Result := '';

bRet := HttpSendRequest(hResourceHandle, nil, 0, LPCSTR(pszSoap), lstrlen(LPCSTR(pszSoap)));
if bRet then
begin

dwStatus := 0;
dwStatusSize := SizeOf(dwStatus);
dwReserved := 0;
bRet := HttpQueryInfo(
hResourceHandle,
HTTP_QUERY_FLAG_NUMBER or HTTP_QUERY_STATUS_CODE,
@dwStatus,
dwStatusSize,
dwReserved
);

if (bRet and (dwStatus = HTTP_STATUS_OK)) then
begin

bRet := InternetQueryDataAvailable(hResourceHandle, dwBytesToWrite, 0, 0);
if (bRet and (dwBytesToWrite > 0)) then
try

repeat

GetMem(pszData, dwBytesToWrite);
if (pszData <> nil) then
try
bRet := InternetReadFile(hResourceHandle, pszData, dwBytesToWrite, dwBytesRead);
if (bRet and (dwBytesRead > 0)) then
begin
pszText := Copy(LPCSTR(pszData), 0, dwBytesRead);
Result := Result + Utf8ToAnsi(pszText);
end;
finally
FreeMem(pszData, dwBytesToWrite);
end;

until
dwBytesRead = 0;

finally
end;

end;

end;

end;
Автор: extasy
Дата сообщения: 13.07.2011 06:26
Maks150988
Возможно следует изменить

Код: bRet := InternetQueryDataAvailable(hResourceHandle, dwBytesToWrite, 0, 0);
if (bRet and (dwBytesToWrite > 0)) then
Автор: Maks150988
Дата сообщения: 13.07.2011 23:01
extasy
Я не умею с дебагером обращаться. Максимум для чего использую так это для запуска откомпилированного приложения. Подскажите тогда способ работы с Array of Byte. Я сделал так.


Код: type
TByteArr = Array of Byte;

function BytesToStr(Buf: TByteArr): AnsiString;
var
I: Integer;
begin
Result := '';
for I := 0 to Pred(Length(Buf)) do
begin
if (Buf[I] <> $00) then
Result := Result + Chr(Buf[I]);
end;
end;

function SendSoapRequest(hResourceHandle: HINTERNET; pszSoap: Utf8String): AnsiString;
var
dwStatus : DWORD;
dwStatusSize : DWORD;
dwReserved : DWORD;
bRet : Boolean;
pszText : Utf8String;
dwBytesToWrite: DWORD;
dwBytesRead : DWORD;
pByteData : TByteArr;
begin
Result := '';
bRet := HttpSendRequest(hResourceHandle, nil, 0, LPTSTR(pszSoap), lstrlen(LPTSTR(pszSoap)));
if bRet then
begin
dwStatus := 0;
dwStatusSize := SizeOf(dwStatus);
dwReserved := 0;
bRet := HttpQueryInfo(
hResourceHandle,
HTTP_QUERY_FLAG_NUMBER or HTTP_QUERY_STATUS_CODE,
@dwStatus,
dwStatusSize,
dwReserved
);
if (bRet and (dwStatus = HTTP_STATUS_OK)) then
begin
bRet := InternetQueryDataAvailable(hResourceHandle, dwBytesToWrite, 0, 0);
if (bRet and (dwBytesToWrite > 0)) then
begin
SetLength(pByteData, dwBytesToWrite);
repeat
ZeroMemory(pByteData, Length(pByteData));
bRet := InternetReadFile(hResourceHandle, Pointer(pByteData), dwBytesToWrite, dwBytesRead);
if (bRet and (dwBytesRead > 0)) then
begin
pszText := Utf8ToAnsi(BytesToStr(pByteData));
Result := Result + pszText;
end;
until
dwBytesRead = 0;
end;
end;
end;
end;

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374

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


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