![]() |
![]() ![]() ![]() | |
|
Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|| Форумы Здесь вы можете задать свой вопрос и наверняка получите ответ |
ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK - Компактные программы на Delphi
| ||
![]() | ||
|
Страницы: 1 2 3 4 5 6
Чтобы не потерять эту дискуссию, сделайте закладку
« предыдущая ветвь | форум | следующая ветвь »
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 6 версия для печати
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)
|
![]() ![]() ![]() |