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

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

Обсуждение замечаний и предложений. [Delphi, Windows]


Страницы:   1 2

Vladimir Kladov ©   (2007-04-14 12:53:00) 

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

И вообще, предложения лучше выкладывать не сразу, как в голову пришли, а выборочно, когда уже окончательно оформлены.

Теперь собственно обсуждение. У меня вопросы: какой тип у IsUnisode - KOLstring? Где вы параметры для IsUnicodeString нашли (F000), что-то я констант соответствующих в windows.pas не вижу. MSDN почитал. Очень не советуют вроде пользоваться IS_TEXT_UNICODE_STATISTICS and IS_TEXT_UNICODE_REVERSE_STATISTICS. Чем и как пользоваться и почему, не пишут. Насчет возвращаемого результата даже не понятно: это может быть не ответ "да, Unicode", а ответ "тест пройден, см. результаты в i" - не больше того.


Vladimir Kladov   (2007-05-18 19:44:00) [1]

up - просьба дублировать все окончательныепредложения по изменения в коде здесь.


Vladimir Kladov   (2007-05-02 16:01:00) [2]

PBT_APMRESUMEAUTOMATIC а, вот почему MultiClipboard до сих пор проблематично восстанавливается после гибернации. Ну, спасибо, что приметили слона.


delphicommctrl   (2007-05-02 00:30:00) [3]

Ошибка в delphicommctrl.inc, строка 1401
Должно быть:

PBT_APMRESUMEAUTOMATIC =  $12;   // 16-ричное 12 (см. Pbt.h)


Galkov   (2007-05-01 21:53:00) [4]

Есть небольшая бага в ASM-версиях NewTabControlи NewTabEmpty

function NewTabControl;
const lenf=high(TabControlFlags); //+++
asm     //cmd    //opd
       PUSH     EBX
       PUSH     ESI
       PUSH     EDI
       XCHG     EBX, EAX
       PUSH     EDX
       PUSH     ECX
       LEA      EAX, [Options]
       MOV      EDX, offset[TabControlFlags]
       XOR      ECX, ECX
       MOV      CL, lenf//*** было 13
       CALL     MakeFlags
...


И ровно то же самоеследует сделать для NewTabEmpty
Пардон: копировал не пересчитывая размер TabControlFlags :)


exero   (2007-04-25 14:55:00) [5]

procedure TDirList.ScanDirectoryEx(const DirPath, Filters: KOLString;
 Attr: DWord);
var F, FF: KOLString;
begin
 FF := Filters;
 if fFilters <> nil then Free_And_nil(fFilters);
 .........
end;

и ассемблерный вариант тоже надо подправить


MTsv DN   (2007-04-24 19:28:00) [6]

property LVColText[ Idx: Integer ]: String read GetLVColText write SetLVColText;
String заменить на KOLString.


Vladimir Kladov   (2007-04-17 21:13:00) [7]

Пример (test2) работает с апплетом. Проверку hwnd тоже можно добавить.


MTsv DN   (2007-04-17 18:18:00) [8]

> Поэтому, если уже шлете код, шлите его мылом, что ли.
Отправил...


mdw   (2007-04-17 18:13:00) [9]

Блин, что-то я не могу с одного раза правильно все написать. Последний, правильный вариант. Файл mirror.pas, строка 24563-24564.

     if Actions[i].Tag <> 0 then
       SL.Add(Format('%s.%s.Tag := %d;', [p, Actions[i].Name, Actions[i].Tag]));


mdw   (2007-04-17 17:46:00) [10]

И в следующей:
       SL.Add(Format('%s.%s.Tag := %d;', [p, Name, Tag]));
на
       SL.Add(Format('%s.%s.Tag := %d;', [p, Name, Actions[i].Tag]));


mdw   (2007-04-17 17:43:00) [11]

Файл mirror.pas, строка 24563.
Нужно поменять:
     if Tag <> 0 then
на
     if Actions[i].Tag <> 0 then


Vladimir Kladov   (2007-04-17 17:15:00) [12]

1. Файл KOL_ASM.PAS. Функции TrimXXX до сих пор string.
KOL_ASM.inc.  Она зкаомментирована для unicode: {$IFDEF ASM_UNICODE}.

Чтобы увидеть выделенный текст, мне надо загружать все обсуждение в браузере. Что накладно. Вот сейчас соединился. 34.6. Еле дышит. Поэтому, если уже шлете код, шлите его мылом, что ли.

MAX_PATH на 65535
И что, если в функции объявляется локальный буфер array[0..MAXPATH] - на стеке предлагаете выделять по стольку? MAX_PATH он и в MS VC++ объявлен 256. Другое дело, что для этой конкретной функции параметр может быть длиннее, и его вообще надо получать как длинную строку, выделяя память по мере длины. Ладно, сделаем. И опционально тоже, а то может кому и малой строки хватает.

AddKeyName
Хорошо.


Don   (2007-04-17 11:23:00) [13]

Извиняюсь за последний пост, модйль не KOLadd, а KOL.
(плохо, что здесь ничего нельзя исправить)


Don   (2007-04-17 11:15:00) [14]


unit KOLadd;

function GetAcceleratorText( const Accelerator: TMenuAccelerator ): KOLstring;
var
 KeyName: array[0..255] of KOLChar;

 procedure AddKeyName( Code: Integer );
 begin
   Code := MapVirtualKey(Code, 0);
   if Code = 0 then exit;
   if GetKeyNameText(Code shl 16, KeyName, 256) > 0 then begin
     if Result <> '' then
       Result := Result + '+';
     Result := Result + KeyName;
   end;
 end;

begin
 ...
end;

там сейчас стоит SizeOf(KeyName), а в UNICODE это 512, а надо 256. Соответственно, под UNICODE GetAcceleratorText не работает.


MTsv DN   (2007-04-17 09:46:00) [15]

Вот решение для ASM-версии (пункт 2):
function WndProcJustOne( Control: PControl; var Msg: TMsg; var Rslt: Integer ) : Boolean;
asm
       MOV      ECX, [EDX].TMsg.message
       SUB      ECX, WM_CLOSE
       JE       @@1
       SUB      ECX, WM_NCDESTROY - WM_CLOSE
       JNE      @@exit
@@1:
        MOV    ECX, [JustOneMutex]
       JECXZ    @@exit

        PUSH     ECX
       MOV      ECX, [EDX].TMsg.hwnd
       CMP      [EAX].TControl.fHandle, ECX
       POP      ECX
       JNE      @@exit


       PUSH     ECX
       //PUSH     ECX
       //CALL     ReleaseMutex
       CALL     CloseHandle
        MOV     [JustOneMutex], 0

@@exit:
       XOR      EAX, EAX
end;


А также еще исправление для ASM-версии, в PAS-коде:
destructor TObj.Destroy;
asm
       PUSH      EAX
       CALL      Final
       POP       EAX
       {$IFDEF USE_NAMES}
        PUSH      EAX
       XOR   EDX, EDX
       XOR   ECX, ECX
       CALL  SetName
       POP       EAX
       PUSH    EAX

       XOR             ECX, ECX
       XCHG    ECX, [EAX].fNamedObjList
       XCHG    EAX, ECX
       CALL    TObj.Free
       POP             EAX
       {$ENDIF}
       XOR       EDX, EDX
       CALL      System.@FreeMem
       //CALL      System.@Dispose
end;

Хотя при уничтожении объекта, выделенным кодом и выполняется попытка "fName := '';", однако из-за:
if NewName = '' then Exit;
вот этой строчке в SetName, этого не происходит. И мемчекер выдает утечку (использую FastMM4). Предлагаю:
   if NewName = '' then
    begin
     fName := '';
     Exit;
    end;


MTsv DN   (2007-04-16 19:47:00) [16]

Если надо больше инфы по поводу 2. Качайте темповый проект: http://www.uus4u.com/download/uuds/temp2.rar


MTsv DN   (2007-04-16 19:35:00) [17]

Привет...

1. Файл KOL_ASM.PAS. Функции TrimXXXдо сих пор string.
2. Файл KOL.PAS(если примите предложение, то и KOL_ASM.PASнадо менять).
function WndProcJustOne( Control: PControl; var Msg: TMsg; var Rslt: Integer ) : Boolean;
begin
 Result := False;
 case Msg.message of
 WM_CLOSE, WM_NCDESTROY:
     if LongBool( JustOneMutex ) and (Control.Handle = Msg.hwnd)then
     begin
       CloseHandle( JustOneMutex );
       JustOneMutex := 0;
     end;
 end;
end;

Предлагаю добавить выделенный участок кода, дабы исключить ошибочное уничтожение мютекса.
3.
function WndProcJustOneNotify( Control: PControl; var Msg: TMsg; var Rslt: Integer ) : Boolean;
var Buf : array[0..MAX_PATH] of KOLChar;
begin
 WndProcJustOne( Control, Msg, Rslt );
 Result := False;
 if Msg.message = JustOneMsg then
 begin
   Result := True;
   if assigned( OnAnotherInstance ) then
   begin
     GetWindowText( Msg.lParam, Buf, MAX_PATH );
     OnAnotherInstance( Buf );
   end;
   Rslt := 0;
 end;
end;

Предлагаю заменить MAX_PATHна 65535.
Обоснование следующее: положим я использую код получения параметров приложения через меню "Отправить". При выделении в системе, положим, 5 элементов SendToформирует строку вида:
"your_app.exe your_param "selItem1" "selItem2" "selItem3" "selItem4" "selItem5"". В WndProcJustOneNotify передается строка без "your_app.exe". Нетрудно догадаться, что MAX_PATH очень быстро "заканчивается"...


Vladimir Kladov   (2007-04-16 16:12:00) [18]

ASM не при чем, ставьте PAS_VERSION. Наверняка ошибка все-таки в другом месте. Как это может быть? Запросто. Как раз знание асма помогает понять.


Dy1   (2007-04-16 15:06:00) [19]

Долго вылавливал ошибку: программа вылетала в случайные моменты времени. KOLnMCK 2.56

procedure TForm1.Button1Click(Sender: PObj);
var
 i: PBitmap;
 s: string;
begin
 i := NewBitmap(1,1);
 i.LoadFromFile('1.bmp');

 system.Str(i.Handle,s); // заменённый модуль
//  int2str(i.Handle); Так я выяснил, что виновата ф-я "int2str". Если число - константа, то прога работала нормально

 i.Free;

ASM знаю не на том уровне, чтобы копаться в функции


Vladimir Kladov   (2007-04-14 22:19:00) [20]

Ну так надо было сразу такой код и давать. Ежи знают, что '?' в имени файла - нонсенс, дхоть в дос, хоть в виндовс.


Страницы:   1 2

Наверх

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