Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »
Страницы: 1 2 3 4 5

KOL 3.23 [Delphi, Windows]


Vladimir Kladov ©   (25.02.15 05:48[40]

Во вчерашнем обновлении не довставил новый TerminateExecution в KOL_ASM.INC. Поправить смогу только вечером. Берите код, что я здесь привел вчера, и вставьте сами (отличается комментариями с паскаль-кодом). Либо включите PAS_VERSION.


QAZ   (25.02.15 11:07[41]

в фрейме видимо не освобождается сама форма или как там ее назвать
если делать так, уничтожая по клику кнопки
procedure TForm1.KOLFormFormCreate(Sender: PObj);
begin
NewForm2(Form2,form1.Panel1);
NewForm3(Form3,form1.Panel2);
end;

procedure TForm1.Button1Click(Sender: PObj);
begin
Form2.Form.Free;
Form3.Form.Free;
Free_And_Nil(Form2);
Free_And_Nil(Form3);
end;

то случайным образом в 4 из 5 случаев, потом, приложение закроется молча, а в 1 случае портянка на весь экран, без Free_And_Nil "корневой" формы стабильно небольшая утечка


QAZ   (25.02.15 11:47[42]

обнаружил также избыточную генерацию бесполезного кода со стороны MCK в *.inc файлах
простой пример, главная форма с центрированием по эрану + панели с выравниванием
procedure NewForm1( var Result: PForm1; AParent: PControl );
begin

 {$IFDEF KOLCLASSES}
 Result := PForm1.Create;
 {$ELSE OBJECTS}
 New( Result, Create );
 {$ENDIF KOL CLASSES/OBJECTS}
 Result.Form := NewForm( AParent, 'Form1' ).SetPosition( 333, 228 );
 Applet :=  Result.Form;
 Result.Form.Add2AutoFree( Result );
   Result.Form.SetClientSize( 649, 361 );
   Result.Form.Font.FontHeight := -11;
   Result.Panel1 := NewPanel( Result.Form, esRaised ).SetAlign ( caBottom ).SetSize( 0, 191 );
   Result.Panel2 := NewPanel( Result.Form, esRaised ).SetAlign ( caRight ).SetSize( 305, 0 );
   Result.Button1 := NewButton( Result.Form, 'Button1' ).SetPosition( 128, 16 );
     Result.Button1.OnClick := Result.Button1Click;
   Result.Form.CenterOnParent;
   Result.KOLFormFormCreate( Result );

end;

сначала форма создается с координатами дизайнтайма SetPosition( 333, 228 );
потом уже под конец центруется на десктопе Result.Form.CenterOnParent;
понятно что при включеных свойствах CenterOnScreen и CenterOnCurrentScreen генерация кода вызова SetPosition( 333, 228 ) нафиг не нужна

панели SetAlign ( caBottom ).SetSize( 0, 191 )
при  наличии включенного свойства выравнивания, должен генерироваться только код SetSize( 0, 191 ), т.к. стартовый размер уже расчивается сразу в дезайнтайме, а SetAlign ( caBottom ) интерактивная рунтайм процедура, которая при создании формы конкретного стартового размера не имеет смысла

думаю таких моментов можно найти еще много при желании
итог - весь тот код что пытаемся экономить в KOL, транжирит MCK


QAZ   (25.02.15 12:48[43]


> а SetAlign ( caBottom ) интерактивная рунтайм процедура

пардон SetAlign странная процедура, ее логичней перевести исключительно в установщик флага выравнивания, без последующего вызова AlignChildrenProc
или выделить подобные функции каким нибуть префиксом типа MCK_UseOnly_ чтобы они только отвечали за установку свойств без интерактива, который при запуске приложения не имеет смысла


Vladimir Kladov ©   (25.02.15 19:46[44]

Обновил.


> избыточную генерацию бесполезного кода

Тоже мне новость. Кому нужен супер-компактный код, пишет "на чистом KOL".


Dimaxx ©   (25.02.15 21:41[45]

2 Vladimir Kladov: Delphi 5

[Error] KOL_ASM.inc(773): Invalid combination of opcode and operands.

По поводу Next - [Hint] KOL.pas(28984): Value assigned to 'Next' never used
при клике ссылается на Next := Prnt.RemoveSubMenu( FId ); в деструкторе.


Dimaxx ©   (25.02.15 21:46[46]

CMP dword ptr [EAX], 0 прокатывает, но я не знаю какая именно разрядность используется - byte/word/dword.


Vladimir Kladov ©   (26.02.15 18:39[47]

Добрался до Delphi5.


> Next - [Hint] KOL.pas(28984): Value assigned to 'Next' never
> used

Хорошо, это есть в Delphi5, согласен. Но это ни на что не влияет. Присваивается, дальше не используется, неприятность -только само сообщение.

Ошибка в CMP [EAX], 0 -- да, пока не поставил Update1, не показывал и компилировал правильно. Конечно, правильно CMP dword ptr [EAX], 0
Ведь в EAX был загружен адрес указателя (LEA EAX, Applet), и этот указатель сравнивается с NIL. Размер указателя в 32-битной платформе был DWORD.

Сейчас буду обновлять версию на сайте.


Dimaxx ©   (26.02.15 22:46[48]

Я проверил в портабельной Д7: CMP [EAX],0 в дизассемблированном виде как раз CMP dword ptr [EAX], 0.

Насчет хинта про неиспользованность - да, этим Д5 частит (а иногда задалбывает). Чем ей не нравится, что переменная используется только в левой части? Я понимаю, когда объявлена переменная, но ее ни разу не использовали в коде. А чем тут не понравилось, хз?


ParanoiS ©   (03.03.15 21:02[49]

Первым делом при получении новой версии KOL.pas изменяю в нем ParamStr и ParamCount.

var
 CmdLineParams: array of String;

function CommandLineToArgvW(lpCmdLine: PWideChar; var pNumArgs: Integer): PPWideChar;
 stdcall; external 'shell32.dll';

function ParamStr( Idx: Integer ): KOLString;
begin
 if (Idx in [0..ParamCount]) then
 Result:=CmdLineParams[Idx] else
 Result:='';
end;

function ParamCount: Integer;
var
 i:Integer;
 p:PPWideChar;
 c:PWideChar;
begin
 if Length(CmdLineParams)=0 then begin
   p:=CommandLineToArgvW(GetCommandLineW,i);
   while p^<>'' do begin
     SetLength(CmdLineParams,Length(CmdLineParams)+1);
     c:=p^;
     CmdLineParams[Length(CmdLineParams)-1]:=KOLString(c);//(OleStrToString(c));
     inc(p);
   end;
 end;
 Result:=Length(CmdLineParams)-1;
end;


Dimaxx ©   (13.04.15 20:21[50]

KOL 3.23.4
Ни с того, ни с сего стал выеживаться StrList. Любой. То постоянно падал на AddStrings - причем и в асме, и в паскалевской реализации. Создал пустой проект для проверки, все работает. O_o. Пересоздал проект заново, глюк исчез. Но когда скомпилировал проект оказалось, что StrList не видит текст внутри себя. Текст грузится из Stream (я для контроля сохранил в промежуточный файл - текст на месте, какой и должен быть). Но Count=0, соответственно цикл перебора строк не начинается, а сразу завершается. Кто-нить сталкивался с подобным? Я впервые столкнулся за много лет использования KOL...


DWorker   (17.04.15 10:03[51]

Давно столкнулся с этим - TStrList.AddStrings асм-версия приводила к падению(кстати подобное было еще у каких-то асм-функций).. Проблему не искал, просто отключил асм версию(на свне отключена до сих пор), пас-версия вроде не падает..


alexacolor   (29.04.15 18:49[52]

пора бы обновить TWindowsVersion, уже есть 8, 8.1, 10!


Владимир Кладов   (05.05.15 21:10[53]

2 alexcolor
До Win8 - можно использовать старый GetVersion[Ex]. Дальше начинаются проблемы. Чтобы просто проверить версию, надо такого нагородить... Рука-лицо, в общем. Смотрю, народ уже сильно не заморачиваясь, просто проверяет ветку реестра. Или версию kernel32.dll. Я пока до проверки Win8 догоню в следующем выпуске, а дальше посмотрим.

Предложения на самый короткий код, решающий эту задачу, принимаются. Можно здесь.

Пока код такой (Паскаль):
function WinVer : TWindowsVersion;
var MajorVersion, MinorVersion: Byte;
   dwVersion, tstVersion: Integer;
begin
 if SaveWinVer <> $FF then Result := TWindowsVersion( SaveWinVer )
 else
 begin
   dwVersion := GetVersion;
   MajorVersion := LoByte( dwVersion );
   MinorVersion := HiByte( LoWord( dwVersion ) );
   tstVersion := ((MajorVersion and 127) shl 8) or MinorVersion;
   {$IFDEF SUPPORT_WIN9X}
   if dwVersion < 0 then
   begin
     case tstVersion of
       $000..$3FF: Result := wv31;
       $400..$409: Result := wv95;
     //$40A..$459: Result := wv98;
       $45A:       Result := wvME;
       else        Result := wv98;
     end;
   end;
   SaveWinVer := Ord( Result );
   Exit;
   {$ENDIF}
   case tstVersion of
   $000..$499: Result := wvNT;
   $500:       Result := wvY2K;
   $501:       Result := wvXP;
   $502..$5FF: Result := wvServer2003;
   $600:       Result := wvVista;
   $601:       Result := wvSeven;
   $602:       Result := wvEight;
   $603:       Result := wvEight_1;
   else        Result := wvTen;
   end;
   SaveWinVer := Ord( Result );
 end;
end;


DWorker   (06.05.15 09:19[54]

Код получился типа такого же, только без SaveWinVer. Только проблема в том что на 8.1 и 10 винде показывает wvEight


Владимир Кладов   (07.05.15 16:33[55]

Я в курсе. Начиная с Windows 8.1, GetVersion/GetVersionEx объявлена устаревшей. Для того, чтобы приложение правильно определяло версию, к нему нужен специально оформленный манифест.


DWorker   (07.05.15 18:12[56]

Короткий вариант, определяет до 10 версии (9х поддержки нет):


function WinVerShort: TWindowsVersion;
begin
 case LoWord(GetVersion) of
   $0005: Result := wvY2K;
   $0105: Result := wvXP;
   $0205: Result := wvServer2003;
   $0006: Result := wvVista;
   $0106: Result := wvSeven;
   $0206: Result := wvEight;
   $0306: Result := wvEight_1;
   $000A: Result := wvTen;
   else
     Result := wvNT;
 end;
end;


Нужен подобный манифест:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
   <assemblyIdentity
       type="win32"
       name="DelphiApplication"
       version="1.0.0.0"
       processorArchitecture="*"
   />
   <description> my foo exe </description>
   <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
       <security>
           <requestedPrivileges>
               <requestedExecutionLevel
                   level="asInvoker"
                   uiAccess="false"
               />
           </requestedPrivileges>
       </security>
   </trustInfo>
   <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
       <application>
           <!-- Windows 10 -->
           <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
           <!-- Windows 8.1 -->
           <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
           <!-- Windows Vista -->
           <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
           <!-- Windows 7 -->
           <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
           <!-- Windows 8 -->
           <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
       </application>
   </compatibility>
</assembly>


alexacolor   (08.05.15 11:06[57]

актуальный манифест нынче очень полезен.

функция _WStrLComp в паскалевском исполнении за гранью добра и зла
из за неё не работают Name Value в WStrList, например


alexacolor   (08.05.15 14:09[58]

p.s. Ну не то что бы за гранью, но может запилить SVN комюнити?
Образовалось ещё одно применение для KOL: firemonkey программы для Windows. Всякие Tray Icon, tree и прочее


Dimaxx ©   (11.05.15 22:12[59]

При создании приложения в KOLProject меняем шрифт - в проекте в файле .inc меняются параметры любые, кроме имени шрифта. В итоге шрифт ВСЕГДА System независимо от заданного. Эта шляпа тянется уже давно - то работает, то после очередного обновления КОЛ опять не работает.


Страницы: 1 2 3 4 5 версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо