Нумерация линий

  • Автор темы Guest
  • Дата начала
Статус
Закрыто для дальнейших ответов.
G

Guest

#1
Недавно начал изучение C++ Builder и решил сделать текстовой редактор,редактор текста сделал,но вот уже несколько недель бьюсь над тем что бы прикрутить к редактору нумерацию строк, что-то наподобии Front Page, помогите пожалуйста.
 
04.09.2006
2 566
3
#2
Можно конечно и руками попытаться сделать, но есть растопыренный компонент, который позволяет сделать еще много чего другого. Называется Ossynedit. Если проект делаешь для себя с целью изучения программирования, то лучше его не используй, т.к. это уже почти готовый редактор
 
G

Guest

#3
Делаю именно для того что бы понять как это работает, так что нужен хотя бы намек в каком направлении идти, компонент не подходит.
 

grigsoft

Well-known member
15.11.2005
735
0
#4
Билдер не знаю - но обычно делают либо в неклиентской области, либо просто сдвигают вывод текста в сторону - и появляется место для номеров.
 
G

Guest

#5
Билдер не знаю - но обычно делают либо в неклиентской области, либо просто сдвигают вывод текста в сторону - и появляется место для номеров.
Нужна именно автоматическая нумерация строк то есть при открытии есть строка с номером 1, но при нажатии на Enter (переход на следущую строку) появлялась строка с номером 2 и так далее.
 

grigsoft

Well-known member
15.11.2005
735
0
#6
А какая разница? Или твой редактор на стандартном edit\richedit основан? Если так - то не знаю. Я думал ты сам редактор написал для обучения.
 
Z

zubr

#8
1. Берем панель, устанавливаем у нее BorderStyle=bsSingle; BevelOuter=bvNone; BevelInner=bvNone;
2. На эту панель ложим Memo Align=alLeft; BevelOuter=bvNone; Ширину ставим только под номера.
3. На панель ложим RichEdit Align=alClient; BevelOuter=bvNone;
4. В обработчике OnChange RichEdit проверяем количество строк RichEdit1->Lines.Count, если изменились по сравнению с предыдущим значением, делаем апдейт в Memo-устанавливаем новые номера.
 
G

Guest

#9
1. Берем панель, устанавливаем у нее BorderStyle=bsSingle; BevelOuter=bvNone; BevelInner=bvNone;
2. На эту панель ложим Memo Align=alLeft; BevelOuter=bvNone; Ширину ставим только под номера.
3. На панель ложим RichEdit Align=alClient; BevelOuter=bvNone;
4. В обработчике OnChange RichEdit проверяем количество строк RichEdit1->Lines.Count, если изменились по сравнению с предыдущим значением, делаем апдейт в Memo-устанавливаем новые номера.
А можно чуть поподробнее с 4 пунктом, если я правильно понял, то надо в обработчике событий написать этот код,но если я его вписываю он выдают ошибку.
 
Z
#10
Код:
void TForm1::SetNum()
{
if(Memo1->Lines->Count==RichEdit1->Lines->Count)
return;

if(Memo1->Lines->Count<RichEdit1->Lines->Count)
{
for(int i=Memo1->Lines->Count; i<RichEdit1->Lines->Count; i++)
{
Memo1->Lines->Add(IntToStr(i+1));
};
}
else
if(Memo1->Lines->Count>RichEdit1->Lines->Count)
{
for(int i=Memo1->Lines->Count; i!=RichEdit1->Lines->Count; i--)
Memo1->Lines->Delete(i-1);
};
};

void __fastcall TForm1::RichEdit1Change(TObject *Sender)
{
SetNum();
}
Да, и сделай Memo1->Enabled=false;
 
G

Guest

#11
[C++ Error] Unit1.cpp(18): E2316 'TForm1::SetNum()' is not a member of 'TForm1'
[C++ Error] Unit1.cpp(40): E2268 Call to undefined function 'SetNum'

Это ошибка в самой IDE или это у меня руки кривые?
 
B

brink

#16
2Ворлог: ...тело функции SetNum() скопируй в оброботчик OnChange RichEdit - будет почти тоже самое.

От меня: если добавить в оброботчик OnKeyUp RichEdit код,

Код:
void __fastcall TForm1::RichEdit1KeyUp(TObject *Sender, WORD &Key,
TShiftState Shift)
{
if(Key == VK_RETURN)
Memo1->Lines->Add(IntToStr(RichEdit1->Lines->Count+1));
}
то по нажатию клавиши <Enter>, у тябя будет появляться номер новой строчки.

удачи.

Да еще: я бы сделал так:
Memo Align=alLeft; BevelOuter=bvNone; BorderStyle=bsSingle; BevelKind=bkSoft; BevelInner=bvRaised;
Color=clGray; Enabled=true;ReadOnly=true; и выбрать цвет для цыфр, например, жолтый:)

2zubr: интересное решение\M/:(
 
Z
#17
Код:
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE-managed Components
private:	// User declarations
void SetNum();
public:		// User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
 
G

Guest

#18
Спасибо огромноеза помощь! :) все работает просто супер!!!!
 
G

Guest

#19
Еще один маленикий вопрос по поводу кода, как сделать что бы прокрутка от RichEdit, прокручивала и поле Memo?
То есть в Memo нумерация строк в RichEdit'e текст то когда я прокручиваю текст нумерация останавливается и вверх не прокручивается вместе с текстом.
 
Статус
Закрыто для дальнейших ответов.