Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не могу найти три отличия в коде [D7]


Страницы:   1 2

Zheksonz ©   (2012-06-14 12:49:00) 

переводил с Си на Делфи следующий код:

__fastcall TWindow::TWindow(TComponent* Owner)
: TForm(Owner)
{
Encoding = TEncoding::UTF8;
ProtocolVersion = 0;
}
//---------------------------------------------------------------------------
void __fastcall TWindow::WriteString(UnicodeString String, TIdTCPClient *TCPClient)
{
Write7BitEncodedInt(Encoding->GetByteCount(String), TCPClient);
TCPClient->Socket->Write(String, Encoding);
}
void __fastcall TWindow::Write7BitEncodedInt(int value, TIdTCPClient *TCPClient)
{
for (; value >= 128; value >>= 7)
 TCPClient->Socket->Write((unsigned char)(value | 128));
TCPClient->Socket->Write((unsigned char)value);
}

UnicodeString __fastcall TWindow::ReadString(TIdTCPClient *TCPClient)
{
return TCPClient->Socket->ReadString(Read7BitEncodedInt(TCPClient), Encoding);
}
int __fastcall TWindow::Read7BitEncodedInt(TIdTCPClient *TCPClient)
{
int value = 0, shift = 0, byteval;
while (((byteval = TCPClient->Socket->ReadByte()) & 128) != 0 & shift != 35)
{
 value |= ((byteval & 127)


Zheksonz   (2012-06-17 23:31:00) [1]

Как обычно я протупил, по другому и не скажешь(((

объявленная мной переменная enc, типа TEncodingи впрямь = nil (спасибо sniknik), отсюда и EAccessViolation


> DVM ©   (17.06.12 19:10) [20]


А вот TEncoding.UTF8.GetByteCount возвращает количество байтов занимаемое строковой переменной. Спасибо.


DVM   (2012-06-17 19:10:00) [2]


> Zheksonz   (17.06.12 13:11) [17]

Тебе какая кодировка нужна? Вот ее класс и используй.

TEncoding.UTF8.GetByteCount


sniknik   (2012-06-17 18:02:00) [3]

> ну что сейчас-то не так??? ((((
enc = nil, внутрь процедуры можно не заглядывать, ее для nil нет.


Inovet   (2012-06-17 16:50:00) [4]

> [17] Zheksonz   (17.06.12 13:11)
> Delphi 2009 или более позднюю версию

или более позднюю


Zheksonz   (2012-06-17 13:11:00) [5]

Чувствую придётся всё-таки установить Delphi 2009 или более позднюю версию...

В общем прикрутил к проекту MLang, всё сделал предельно просто:

var
 strng: string;
 i: Integer;
 enc: TEncoding;
begin
strng := 'wrwdsfsfsrwer';
i := enc.GetByteCount(strng);
end;


но при запуске этой процедуры выскакивает ошибка EAccessViolation в функции:
function TEncoding.GetByteCount(const S: string): Integer;
begin
 Result := GetByteCount(PChar(S), Length(S));
end;


ну что сейчас-то не так??? ((((


Zheksonz   (2012-06-16 23:35:00) [6]


> Anatoly Podgoretsky ©   (16.06.12 23:05) [15]


Ехидство подтверждающее сказанное мной ранее... а не пришло ли время поумничать?


Anatoly Podgoretsky   (2012-06-16 23:05:00) [7]


> Zheksonz   (16.06.12 22:01) [14]

Значит для тебя не судьба, придется отказаться от мечты.


Zheksonz   (2012-06-16 22:01:00) [8]


> Anatoly Podgoretsky ©   (16.06.12 15:44) [12]


Надо полагать вы так же жили, ехидничая и умничая.


> DVM ©   (16.06.12 16:34) [13]


Спасибо, это то что нужно! Жаль у меня нет возможности Вас отблагодарить не только на словах, но и на деле.


DVM   (2012-06-16 16:34:00) [9]


> Zheksonz   (16.06.12 13:57) [11]


> А в Делфи 7 нельзя реализовать подобное, без класса TEncoding?

Можно и без, но имхо с ним гораздо удобнее. Тем более, что его и Delphi 7 можно прикрутить. Тут http://www.webdelphi.ru/2011/06/obnovlenie-mlang-dobavlena-podderzhka-delphi-4-xe/качаешь MLang для Delphi 4 - XE   http://www.webdelphi.ru/wp-content/plugins/download-monitor/download.php?id=90там есть Encodings.pas в нем почти такой же класс как в юникодных делфи.


Anatoly Podgoretsky   (2012-06-16 15:44:00) [10]

Как же мы жили то до TEncoding?


Zheksonz   (2012-06-16 13:57:00) [11]


> DVM ©   (14.06.12 17:59) [10]


А в Делфи 7 нельзя реализовать подобное, без класса TEncoding? А то как-то специально под него не хочется переустанавливать делфи. Да и не нашёл с ходу более или менее подходящую версию для скачивания(((


DVM   (2012-06-14 17:59:00) [12]


> DVM ©   (14.06.12 16:53) [5]
>
> А что не так?

1. SizeOf вернет 4, а не количество байт
2. Класс TEncoding есть и в Делфи, начиная с 2009, используй его.


ProgRAMmer Dimonych   (2012-06-14 17:16:00) [13]

> [8] Zheksonz   (14.06.12 17:11)

В D2010 RawByteString, возвращаемая UTF8Encode() определена как AnsiString. А SizeOf(AnsiString), если не ошибаюсь, есть ничто иное, как 4. Наверное, поэтому и [5].


Zheksonz   (2012-06-14 17:11:00) [14]

DVM ©   (14.06.12 16:53) [5]

А что не так? и там и там передаётся количество байтов, которое занимает посылаемая команда... Если нет, то в чём я неправ?


Zheksonz   (2012-06-14 17:01:00) [15]


> DVM ©   (14.06.12 16:53) [5]


Я сразу предупреждаю, кто не в курсе ещё, до меня долго доходит... вы главное не нервничайте...

А по вопросу, да, но судя по уровню сарказма в вопросе я неправ(((


Zheksonz   (2012-06-14 16:58:00) [16]

В оригинале в integer переменную записывается байт, командой byteval = TCPClient->Socket->ReadByte()

я пробовал
byteval := TCPClient.ReadInteger;
и
TCPClient.ReadBuffer(byteval, 1);

но выдаётся ошибка "socket error # 10054" (((


DVM   (2012-06-14 16:53:00) [17]


> Zheksonz

По твоему:
Write7BitEncodedInt(SizeOf(UTF8Encode(strng)), TCPClient);
Это аналог:
Write7BitEncodedInt(Encoding->GetByteCount(String), TCPClient);
???


RWolf   (2012-06-14 13:22:00) [18]

зато есть ReadBuffer.


Zheksonz   (2012-06-14 13:18:00) [19]

в смысле непосредственно из TidTCPClienta


Zheksonz   (2012-06-14 13:18:00) [20]


> RWolf ©   (14.06.12 13:09) [1]
> Если исходник делает Socket->ReadByte(), а перевод — ReadInteger,
>  то весьма вероятно, что это не будет работать.


Да дело в том, что в Делфи вообще нет функции чтения байта((


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо