![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопросы к Старшим [D7, WinXP]
MYRX © (2008-04-17 10:56:00)Добрый день, уважаемые мастера. Взялся я писать куросовой на KOL
хочется написать простенький редактор pas-файлов
Задумка:
возможность открывать несколько файлов на разных вкладках
для этого сделал отдельный фрейм с редактром кода
и создаю его на каждой вкладке так:
procedure CreateEmptyTab(Str:String);
var tmp:PfrEditor;
begin
if not Assigned(FrameList) then
FrameList:=NewList;
if not Assigned(PathList) then
PathList:=NewStrList;
fmMan.TCMain.TC_Insert(fmMan.TCMain.Count,'',0);
fmMan.TCMain.CurIndex:=fmMan.TCMain.Count-1;
fmMan.TCMain.TC_Items[fmMan.TCMain.CurIndex]:=Str;
NewfrEditor(tmp,fmMan.TCMain.Pages[fmMan.TCMain.CurIndex]);
FrameList.Add(tmp);
PfrEditor(FrameList.Item[fmMan.TCMain.CurIndex]).MEPas.Focused:=True;
PathList.Add('');
end;
В PathList храню пути до файлов, открытых на вкладках или пустую строку, если вкладка пустая
в FrameList хранятся указатели на созданные фреймы
MEPas - это memo на фрейме
вопрос заключается в следующем:
как мою задумку организовать правильно
а еще как все это правильно уничтожить при закрытии вкладки
подскажите плиззз
exero (2008-05-21 15:12:00) [1]Кстати, на Delphi я знаю только одну по настоящему крутую систему такого типа - Directum - но так KOL и не пахнет.
exero (2008-05-21 15:03:00) [2]Читай книжку по KOL...
Но я тебя предупредил... Совесть моя спокойна, может сам дойдешь до .net, и очень жалко будет времени потраченного на другие велосипеды )).
Особенно когда будешь заниматься "навороченной системой для предприятия".
В крайнем случае используй Delphi.net - хотя это уже костыль каких поискать.
MYRX (2008-05-21 14:41:00) [3]Ну вот нравится мне Delphi, :) ну хоть убей нравится
алгоритмы - согласен очень важны
Мне нежно знать какую БД лучше брать за основу
при прочих равных условиях?
Но с учетом того, что кодить я буду с использованием KOL
exero (2008-05-21 13:27:00) [4]
> Хочу обеспечить максимальную скорость работы, а значит надо
> использовать KOL, да и вообще мне KOL кажется гораздо удобнее,
> чемVCL.
KOL сам по себе не делает программы быстрыми! Рулят только алгоритмы - все остальное по большому счету ерунда. Компактный размер != скорость.
> Курсовой почти завершеннастала пора подумать о работеХочу
> очень навороченую систему построить для предприятияЕстественно
> встает вопрос о базе данныхВ базе должны храниться не только
> табличные данные, но и файлы
> Поэтому исходя из того, что программа пишется на KOL какуюБД
> посоветуете взять за основу?
Выбор БД не должен быть завязан на KOL.
А вообще мой тебе совет - перелазь на .NET и С#. Все разработки, за исключением прошивок контроллеров, перевел на .NET - этой действительно экономит массу времени и сил.
Хотя идеологически более правильна Java - во всяком случае не так подвержена капризам MS.
MYRX (2008-05-21 10:58:00) [5]Курсовой почти завершен
настала пора подумать о работе
Хочу очень навороченую систему построить для предприятия
Естественно встает вопрос о базе данных
В базе должны храниться не только табличные данные, но и файлы
Почему в этом топике?
Хочу обеспечить максимальную скорость работы, а значит надо использовать KOL, да и вообще мне KOL кажется гораздо удобнее, чем
VCL.
Поэтому исходя из того, что программа пишется на KOL какую
БД посоветуете взять за основу?
Я новичок поэтому прошу совета профессионалов
MYRX (2008-05-19 14:57:00) [6]Упс...
Не подумал
Топик не подскажите?
exero (2008-05-19 10:26:00) [7]А вы уверены что это хоть как то относится к KOL?
MYRX (2008-05-19 10:03:00) [8]Прошу прощения, я абсолютно неправильно выразил свои мысли
Задача такова
Есть файл на диске с программой на паскале
мне нужно определить максимальный уровень вложенности циклов
никто не подскажет, как осуществить эту задумку?
MYRX (2008-05-16 15:24:00) [9]За ссылочку, спасибо!
(красиво:))
//-----------------------------------------------------
Изучал тут теорию синтаксического анализа, но
1) там пример простейшего кальколятора
2) Мне не нужно писать компилятор, мне просто нужно замерить уровень вложенности циклов.
Кто-нибудь сталкивался с подобной задачей?
Поделитьесь, пожалуйста опытом.
Как, наиболее рациональным способом измерить этот самый уровень вложенности?
Demt (2008-05-15 13:37:00) [10]В Компонентах-Контролы на KOLnMCK есть.
http://kolnmck.ru/files/components/controls/xpmenus.7z
MYRX (2008-05-15 09:16:00) [11]Спасибо! в очередной раз выручил
А ссылочку не дашь на XPMenus?
а то я что-то не натыкался на такой компонент
Compiler (2008-05-15 00:22:00) [12]> Compiler © (15.05.08 00:21) [39]
OwnerDraw:=True; У каждого итема меню
Compiler (2008-05-15 00:21:00) [13]> 1) Кто-нибудь знает, как расширить сами пункты меню, чтобы
> в них влезали большие иконки? (большие - красивше смотрятся)
Изврат конечно, но для решения некоторвх задач подойдет
const
mItemHeight=30;
mItemWidth=100;
procedure DrawBitmap(DC: HDC;R:TRect;Bitmap:HBITMAP);
var
DCfrom, DC0: HDC;
oldBmp: HBitmap;
B: TagBitmap;
begin
if Bitmap <> 0 then
begin
if GetObject( Bitmap, sizeof( B ), @B ) <> 0 then
begin
DC0 := GetDC( 0 );
DCfrom := CreateCompatibleDC( DC0 );
ReleaseDC( 0, DC0 );
oldBmp := SelectObject( DCfrom, Bitmap );
BitBlt( DC, R.Left+1,
R.Top+(((R.Bottom- R.Top)-B.bmHeight) div 2),
B.bmWidth, B.bmHeight,
DCfrom, 0, 0, SRCCOPY );
SelectObject( DCfrom, oldBmp );
DeleteDC( DCfrom );
end;
end;
end;
function TForm1.MainMenu1DrawItem(Sender: PObj; DC: HDC; const Rect: TRect;
ItemIdx: Integer; DrawAction: TDrawAction;
ItemState: TDrawState): Boolean;
var
r:TRect;
begin
if (ItemIdx>=0) then begin
R:=Rect;
Inc(R.Left,40);
FillRect(DC,Rect,GetSysColorBrush(COLOR_MENU));
if PMenu(Sender).ItemEnabled[ItemIdx] then
begin
if odsSelected in ItemState then
FillRect(DC,Rect,GetSysColorBrush(COLOR_BTNFACE));
SetTextColor(DC,ClBlack);
end else begin
SetTextColor(DC,ClGrey);
end;
SetBkMode(DC,TRANSPARENT);
DrawBitmap(DC,Rect,PMenu(Sender).ItemBitmap[ItemIdx]);
// или DrawIconEx(DC, Rect.Left,Rect.Top, LoadIcon(0,IDI_HAND),30,30, 0, 0, DI_NORMAL );
DrawText(DC, Pchar(PMenu(Sender).ItemText[ItemIdx]),Length(PMenu(Sender).ItemText[ItemIdx]),
R,DT_SINGLELINE or DT_VCENTER or DT_NOPREFIX);
end;
end;
function TForm1.KOLForm1Message(var Msg: tagMSG;
var Rslt: Integer): Boolean;
var MIS: PMeasureItemStruct;
begin
Result := FALSE;
case Msg.message of
WM_MEASUREITEM : begin
MIS := Pointer(msg.lParam);
with MIS^ do begin
begin
itemHeight := mItemHeight;
ItemWidth:=mItemWidth;
Result := True;
end;
end;
end;
end;
end;
Еще можно использовать XPMenus, там можно задавать высоту и ширину меню не используя OnDrawItem, да и выглядит он лучше
MYRX (2008-05-14 13:45:00) [14]По ходу назрело еще два вопроса:
1) Кто-нибудь знает, как расширить сами пункты меню, чтобы в них влезали большие иконки? (большие - красивше смотрятся)
2) И еще просьбочка:
Поделитесь, пожалуйста, алгоритмом для анализа pas-файлов
очень нужно определить уровень вложенности циклов.
MYRX (2008-05-14 13:40:00) [15]Супер!
Спасибо, Compiler.
Работает гораздо лучше моего алгоритма
вот что значит опыт.
При большом количестве иконок выигрыш на лицо.
Compiler (2008-05-08 14:14:00) [16]> Очень хочется позаморачивться )
Сколько угодно. ;)
procedure BitmapCopyRect(OutBmp:HBITMAP; const OutRect: TRect; InBmp: HBITMAP;
const InRect: TRect);
var InDC, OutDC: HDC;
OldInDC, OldOutDC: THandle;
begin
if (OutBmp = 0) or (InBmp = 0) or
(OutBmp =InBmp) then Exit;
InDC := CreateCompatibleDC( 0 );
OldInDC := SelectObject( InDC, InBmp );
OutDC := CreateCompatibleDC( 0 );
OldOutDC := SelectObject( OutDC, OutBmp );
StretchBlt( OutDC, OutRect.Left, OutRect.Top, OutRect.Right - OutRect.Left,
OutRect.Bottom - OutRect.Top, InDC, InRect.Left, InRect.Top,
InRect.Right - InRect.Left, InRect.Bottom - InRect.Top,
SRCCOPY );
SelectObject( OutDC, OldOutDC );
DeleteDC( OutDC );
SelectObject( InDC, OldInDC );
DeleteDC( InDC );
end;
var IL: pImageList;
procedure TForm1.KOLFormFormCreate(Sender: PObj);
var
Ob,InB:PBitmap;
begin
inb:=NewBitmap(0,0); //Рисунок из ресурса Высота 22 Ширина 216
Ob:=NewBitmap(144,16); //Уменьшенный рисунок
InB.LoadFromResourceName(hinstance,'MAIN');
BitmapCopyRect(OB.Handle,MakeRect(0,0,Ob.Width,Ob.Height),
InB.Handle,MakeRect(0,0,InB.Width,InB.Height));
IL := NewImageList( Form );
IL.Colors := ilcColorDDB;
IL.ImgWidth := 16;
IL.ImgHeight := 16;
IL.AddMasked(Ob.Handle,ClWhite);
InB.Free;
Ob.Free;
Danger (2008-05-08 11:01:00) [17]
> MYRX (08.05.08 09:38) [34]
> Просто неохота разбабахивать (увеличивать размер)
> программу еще и уменьшенными копиями
> уже имеющихся иконок
>
Если есть ICO-файл с нужной коллекцией значков, открываете его в редакторе иконок, и экспортируете из всего набора только маленькую иконку. Потом в вашей программе ставите размер значков в ImageList'e 16х16, и добавляете туда ваш значок, вот и все. А большие значки из коллекции (32х32, 48х48) нет нужды таскать за собой, если они реально не будут использоваться.
Аналогично, если требуется размер 32х32 - ставите соответствующий размер в ImageList'e и добавляете в него только значок размером 32х32, выдранный из ICO-файла.
MYRX (2008-05-08 09:38:00) [18]Очень хочется позаморачивться )
у Битмапа есть же StretchDraw
Может можно это как-то использовать?
Просто неохота разбабахивать (увеличивать размер)
программу еще и уменьшенными копиями
уже имеющихся иконок
Нет ничего невозможного
Наверняка - же существует способ решить и эту проблему
Только я сам не додумаюсь,
потому и уповаю на более опытных товарищей
Danger (2008-05-08 06:13:00) [19]
> Demt (07.05.08 19:13) [32]
> MYRX, уменьшать надо графическим редактором, либо редактором
> иконок.
Или сразу грузить иконки подходящего размера (16х16). Обычно иконки (ICO) содержат в себе изображения разных размеров, скорее всего будут содержать и маленький значок. Можно выдрать его из коллекции и грузить только его в ImageList.
А если неохота заморачиваться, можно в нете поискать готовые наборы значков нужного размера, их там на любой вкус и цвет...
Demt (2008-05-07 19:13:00) [20]MYRX, уменьшать надо графическим редактором, либо редактором иконок.