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

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

Вопросы к Старшим [D7, WinXP]


Страницы:   1 2 3

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;


Страницы:   1 2 3

Наверх

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