![]() |
| ||
|
|
Новости |
Поиск |
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 на фрейме
вопрос заключается в следующем:
как мою задумку организовать правильно
а еще как все это правильно уничтожить при закрытии вкладки
подскажите плиззз
MYRX (2008-05-07 09:54:00) [21]Снова выручаешь, Danger, спасибо!
Остался еще вопрос:
У меня в ImageList иконки хранятся 48х48
а как их уменьшить?
а то у меня в менюшках только краешки этих иконок рисуются...
Danger (2008-05-03 20:57:00) [22]
> А кто - нить знает, как к popup привязать иконки (чтобы
> слева от пунктов отображались) и как в main-меню такое-же
> сотворить?
В design-time свойства bitmap* элементов меню. Независимо от типа меню (main/popup).
MYRX (2008-05-03 14:24:00) [23]А кто - нить знает, как к popup привязать иконки (чтобы слева от пунктов отображались) и как в main-меню такое-же сотворить?
MYRX (2008-05-03 14:21:00) [24]Спасибо, Дмитрий!
Программа стла гораздо симпатичней.
Дмитрий К (2008-04-30 14:46:00) [25]Индекс вкладки над которой находится курсор можно узнать вот так:
function TabUnderCursorIndex: Integer;
var p: TPoint; r: TRect;
begin
GetCursorPos(p);
GetWindowRect(Tabs.Handle, r);
Result := Tabs.TC_TabAtPos(p.X - r.Left, p.Y - r.Top);
end;
MYRX (2008-04-30 10:51:00) [26]Еще один, наверное простой, вопрос:
Как сделать так, чтобы вкладка в TabControl выделялась по правому щелчку мыши(я подвязал к нему popup менюшку, вот и хочется, чтобы popup срабатывал для той вкладки, по которой был сделан правый клик)
mdw (2008-04-22 19:17:00) [27]http://thaddy.co.uk/koltomdemo.zip
=BuckLr= (2008-04-22 15:12:00) [28]
> www.thaddy.com
Да я понял. Только нету там такого компонента :) Если есть у тебя, можешь скинуть?
mdw (2008-04-22 13:24:00) [29]www.thaddy.com
=BuckLr= (2008-04-22 13:20:00) [30]У Thaddy? Это где? Я не видел... Было бы интересно посмотреть. Просто я видел на wasm.ru статью о реализации подсветки на основе richedit, но на asm-е. Думаеццо, раз можно на asm-t, то можно и на delphi :)
mdw (2008-04-22 11:51:00) [31]У тедди на сайте есть нечто подобное, но довольно глючно работает. Я вообще на основе richedit не одной работоспособной реализации не видел.
=BuckLr= (2008-04-22 11:02:00) [32]По ходу обсуждения. А возможно ли реализовать компонент, аналогичный этому, только на основе richedit? Любопытно, но я никогда не видел подобной реализации.
MYRX (2008-04-21 20:05:00) [33]Спасибо.
Теперь все встало на свои места.
mdw (2008-04-21 19:11:00) [34]
> 2)Что вообще означает "Токен"? (просто если пойму, то наверное
> будет попроще)
token
1) знак
2) примета, признак
> 1) что мы должны вернуть в резалте HEditScanToken, т.
> е. что означает возвращаемое нами число?
Открываем KOLHilightEdit.pas и читаем:
TOnScanToken = function( Sender: PControl; const FromPos: TPoint;
var Attrs: TTokenAttrs ): Integer of object;
{ Методика подцветки синтаксиса такова: устанавливается обработчик события
OnScanToken, который по необходимости получает координату FromPos, берет
строку Lines[ FromPos.Y ], и с позиции FromPos.X (считается с нуля)
определяет атрибуты токена (записывает их в Attrs), и возвращает длину токена.
Не надо делать никакого компонента, если без него можно обойтись. }
Короче, вернуть должны длину строки, для которой устанавливаем атрибуты Attrs, в следующий раз OnScanToken будет вызываться уже со сдвигом на эту длину.
MYRX (2008-04-21 17:06:00) [35]Спасибо, mdw!
сегодня ночью попробую.
Вот только не понимая что к чему трудно пользоваться, а тем более дорабатывать
Я так и не могу понять:
1) что мы должны вернуть в резалте HEditScanToken,
т.е. что означает возвращаемое нами число?
2)Что вообще означает "Токен"? (просто если пойму, то наверное будет попроще)
mdw (2008-04-21 11:41:00) [36]У меня примерно так. Правда многострочные коментарии так и не доделал.
type TTokens = (tNone, tReservedWord, tComment, tCharStr, tDigital);
const ReservedWordsCount = 72;
ReservedWords: array [0..ReservedWordsCount-1]of string = (
'and', 'array', 'as', 'asm',
'begin', 'case', 'class', 'const',
'constructor', 'destructor', 'dispinterface', 'div',
'do', 'downto', 'else', 'end',
'except', 'exports', 'file', 'finalization',
'finally', 'for', 'function', 'goto',
'if', 'implementation', 'in', 'inherited',
'initialization', 'inline', 'interface', 'is',
'label', 'library', 'mod', 'nil',
'not', 'object', 'of', 'or',
'out', 'packed', 'procedure', 'program',
'property', 'raise', 'record', 'repeat',
'resourcestring', 'set', 'shl', 'shr',
'string', 'then', 'threadvar', 'to',
'try', 'type', 'unit', 'until',
'uses', 'var', 'while', 'with',
'xor', 'private', 'protected', 'public',
'published', 'automated', 'at', 'on'
);
procedure TCodesForm.KOLMDIChildFormCreate(Sender: PObj);
var i: Integer;
Item: THandle;
begin
FReservedWords:= NewStrList;
for i:= 0 to ReservedWordsCount-1 do ReservedWords.Add(ReservedWords[i]);
FReservedWords.Sort(False);
end;
function TCodesForm.HEditScanToken(Sender: PControl; const FromPos: TPoint; var Attrs: TTokenAttrs): Integer;
begin
Attrs.fontcolor := clWindowText;
Attrs.fontstyle := [ ];
case ParseLine(HEdit.Edit.Lines[FromPos.Y], FromPos.X+1, Result) of
tReservedWord: Attrs.fontstyle:= [fsBold];
tComment: begin
Attrs.fontstyle:= [fsItalic];
Attrs.fontcolor:= clGrayText;
end;
tCharStr: begin
Attrs.fontstyle:= [];
Attrs.fontcolor:= clFuchsia;
end;
tDigital: begin
Attrs.fontstyle:= [];
Attrs.fontcolor:= clBlue;
end;
end
end;
const Separators = ' ;.,:=>
Danger (2008-04-21 11:07:00) [37]
> P.S.
> Пробовал использовать PVMHSyntaxEdit + PVMHPasHighlighter
> программа увеличилась вдвое ((
Ладно бы размер, но к сожалению там есть глюки в самом редакторе - к примеру, помню, что не удавалось перетащить выделенный блок текста в редакторе (хотя оригинальный TSynEdit позволял так делать).
MYRX (2008-04-21 02:41:00) [38]Снова я)
Запостю весь топик глупыми вопросами,
но что делать?
Если нет своего ума - одолжи у другого.
Возник вопрос такой:
хочу в этом редакторе подсветку синтаксиса сделать на базе KOLHilightEdit
очень шустрый, маленький и функциональный компонент, (респект Кладову)
но вот беда, не получается у меня пользоваться его функционалом
ключевые слова кое-как подсвечиваю
function TEditor.HilightPAS(Sender: PControl; const FromPos: TPoint; var Attrs: TTokenAttrs): Integer;
...
begin
S := fHEdit.Edit.Lines[ FromPos.Y ];
Result := 0;
if S = '' then
begin
i := FromPos.X;
isReserved := FALSE;
...
if not fStr and
((AnsiCompareStrNoCase( Copy( S, i+1, 5 ), 'begin' ) = 0) or
(AnsiCompareStrNoCase( Copy( S, i+1, 3 ), 'end' ) = 0) or
(AnsiCompareStrNoCase( Copy( S, i+1, 3 ), 'var' ) = 0) or
(AnsiCompareStrNoCase( Copy( S, i+1, 5 ), 'const' ) = 0) or
(AnsiCompareStrNoCase( Copy( S, i+1, 2 ), 'or' ) = 0) or
(AnsiCompareStrNoCase( Copy( S, i+1, 2 ), 'if' ) = 0) or
(AnsiCompareStrNoCase( Copy( S, i+1, 4 ), 'then' ) = 0) or
(AnsiCompareStrNoCase( Copy( S, i+1, 3 ), 'for' ) = 0) or
(AnsiCompareStrNoCase( Copy( S, i+1, 5 ), 'while' ) = 0) or
(AnsiCompareStrNoCase( Copy( S, i+1, 2 ), 'do' ) = 0) or
(AnsiCompareStrNoCase( Copy( S, i+1, 8 ), 'function' ) = 0) or
(AnsiCompareStrNoCase( Copy( S, i+1, 9 ), 'procedure' ) = 0) or
(AnsiCompareStrNoCase( Copy( S, i+1, 14 ), 'implementation' ) = 0) or
(AnsiCompareStrNoCase( Copy( S, i+1, 5 ), 'array' ) = 0) or
(AnsiCompareStrNoCase( Copy( S, i+1, 11 ), 'constructor' ) = 0) or
(AnsiCompareStrNoCase( Copy( S, i+1, 8 ), 'property' ) = 0) or
(AnsiCompareStrNoCase( Copy( S, i+1, 4 ), 'type' ) = 0) or
(AnsiCompareStrNoCase( Copy( S, i+1, 10 ), 'destructor' ) = 0) or
(AnsiCompareStrNoCase( Copy( S, i+1, 4 ), 'uses' ) = 0) or
(AnsiCompareStrNoCase( Copy( S, i+1, 9 ), 'interface' ) = 0) or
(AnsiCompareStrNoCase( Copy( S, i+1, 7 ), 'program' ) = 0) or
(AnsiCompareStrNoCase( Copy( S, i+1, 2 ), 'in' ) = 0) or
(AnsiCompareStrNoCase( Copy( S, i+1, 4 ), 'object' ) = 0)
... ) then
begin
isReserved := TRUE;
if S[ i+1 ] <= ' ' then
while (i < Length( S )) and (S[ i+1 ] <= ' ') and ( not (S[ i+1 ] in delims)) and (S[i+1]<>#39) do inc( i )
else
while (i < Length( S )) and (S[ i+1 ] > ' ') and ( not (S[ i+1 ] in delims)) and (S[i+1]<>#39) do inc( i );
end
...
Result := i - FromPos.x;
if isReserved then
begin
Attrs.fontstyle := [ fsBold ];
Attrs.fontcolor := 16776960;
Attrs.backcolor := clBlack;
end
...
begin
Attrs.FontStyle := [ ];
Attrs.fontcolor := clWhite;
Attrs.backcolor := clBlack;
end;
end;
А вот как подсветить строковые параметры (те, что в кавычках)?- ума не приложу
до 3-х часов ночи бился, так и не победил
поделитесь, кто-нить опытом, если не жалко...
P.S.
Пробовал использовать PVMHSyntaxEdit + PVMHPasHighlighter
программа увеличилась вдвое ((
MYRX (2008-04-19 01:57:00) [39]Быстро, посто и удобно!
Все работает
Спасибо, Compiler!
Compiler (2008-04-18 22:16:00) [40]Для работы с jpeg и gif я использую юнит tinyJPGGIFBM от homm, который входит в состав GrushControls
Вот примерчик:
var
B:PBitmap;
...
b:=NewBitmap(0,0);
tinyLoadJPGGIFBMPResource(b,hinstance,'Splash','Splash');
b.Draw(Form.canvas.handle,0,0);
...
B.Free;