писал это ещё под С4 но вроде с тех пор в этом ничего не менялось, тут правда тока для PledgeCrest, но для AllyCrest просто размерчики подогнать или сделать выбор для них чтоб универсально было
юзать например так (вырезка из моего бота):
delphi Код:
TFixPck = packedrecordcaseIntegerof0:(ch: array[Word] ofChar);
1:(bt: array[Word] ofByte);
2:(size: Word;
id: Byte;
dbt: array[0..65532] ofByte);
end;
var pck: TFixPck;
procedure TBotMain.RecvPledgeCrest;
var
_clan: TClan;
begin
_clan:=wo.GetClanByClanCrestId(rwpck.ReadD);
if _clan<>nil then _clan.bmpIcon:=DDS_DXT1_To_Bitmap(pck.dbt[8]);
end;
__________________
Я здесь практически не появляюсь!, Skype - ikskor
С мемо на форме считываю пакет PledgeCrest в хексе, после определенных переобразований формирую сам пакет по примеру TFixPck, хочу вывести на форму картинку со значком клана, но чет не получается ошибка где-то в функции конвертирования, в чем может быть проблема? Может я неправильно формирую TFixPck. Вот код
Код:
procedure TForm1.Button2Click(Sender: TObject);
Type
TFixPck = packed record case Integer of
0:(ch: array[Word] of Char);
1:(bt: array[Word] of Byte);
2:(size: Word; id: Byte; dbt: array[0..65532] of Byte);
end;
var
Bmp: TBitmap;
pck: TFixPck;
s: string;
i: integer;
begin
//Формирую pck
pck.size:=2+Round(Length(SymbolEntersCount(Memo1.text))/2);
Edit6.Text:=InvertStr(IntToHex(pck.size,4))+SymbolEntersCount(Memo1.text);
s:=HexToString(InvertStr(IntToHex(pck.size,4))+SymbolEntersCount(Memo1.text));
Edit7.Text:=StringToHex(s,'');
for i:=1 to Length(s) do
begin
pck.ch[i]:=s[i];
pck.bt[i]:=Byte(pck.ch[i]);
if i=3 then pck.id:=Byte(pck.ch[i]);
if i>3 then pck.dbt[i-3]:=pck.bt[i];
end;
for i:=1 to Length(s) do //смотрю че записало в масивы
begin
Edit1.Text:=Edit1.Text+StringToHex(pck.ch[i],' ');
Edit2.Text:=Edit2.Text+IntToHex(pck.bt[i],2);
Edit3.Text:=Edit3.Text+IntToHex(pck.dbt[i],2);
end;
Edit4.Text:=IntToHex(pck.size,4);
Edit5.Text:=IntToHex(pck.id,2);
//формирую Bmp
Bmp:=TBitmap.Create;
//Bmp.PixelFormat:= pf24bit;
try begin
bmp.Width:=DDS_DXT1_To_Bitmap(pck.dbt[8]).width;
bmp.Height:=DDS_DXT1_To_Bitmap(pck.dbt[8]).height;
bmp:=DDS_DXT1_To_Bitmap(pck.dbt[8]);
end;
except on E : Exception do
ShowMessage('с картинкой то говнецо '+E.ClassName+' ошибка: '+E.Message);
end;
Image1.Canvas.Draw(0, 0, bmp);
//Bmp.SaveToFile('c:\test.bmp');
Bmp.Free;
end;
(Такое количество Editов для мониторинга ибо часто ошибаюсь)
и доп. ф-я для ивертации порядка байт в части размера
Код:
function InvertStr(s: string):string;
var i,j:integer; r: string;
begin
r:=s;
j:=1;
for i:=1 to round(length(s)/2) do
begin
r[length(s)-j]:=s[j];
r[length(s)+1-j]:=s[j+1];
j:=j+2;
end;
result:=r;
end;
прошу помощи, совета, критики
все работает прекрасно, bmp:=DDS_DXT1_To_Bitmap(pck.dbt[9]); считывать с 9го байта надо было
Последний раз редактировалось vahes, 24.07.2011 в 16:36.
Причина: сам дошел
еще маленький вопросик, заметил одну кляксу, когда присваиваю pck.id значение 3го байта, 2му байту тоже присваивается значение 3го байта. Немогу понять в чем косяк, то ли в формировании массива, то ли может IntToHex как-то косячит и в Эдиты выводится инфа не соответствующая инфе в масивах. Кароче не пойму в чем проблема.
//Формирую pck
pck.size:=2+Round(Length(SymbolEntersCount(Memo1.text))/2);
Edit6.Text:=InvertStr(IntToHex(pck.size,4))+SymbolEntersCount(Memo1.text);
s:=HexToString(InvertStr(IntToHex(pck.size,4))+SymbolEntersCount(Memo1.text));
Edit7.Text:=StringToHex(s,'');
for i:=1 to Length(s) do
begin
pck.ch[i]:=s[i];
pck.bt[i]:=Byte(pck.ch[i]);
if i=3 then pck.id:=Byte(pck.ch[i]);
if i>3 then pck.dbt[i-3]:=pck.bt[i];
end;
for i:=1 to Length(s) do //смотрю че записало в масивы
begin
Edit1.Text:=Edit1.Text+StringToHex(pck.ch[i],' ');
Edit2.Text:=Edit2.Text+IntToHex(pck.bt[i],2);
Edit3.Text:=Edit3.Text+IntToHex(pck.dbt[i],2);
end;
Edit4.Text:=IntToHex(pck.size,4);
Edit5.Text:=IntToHex(pck.id,2);