Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Сохранение с разных закладок


Автор: xa3apg 11.10.2008, 09:29
Доброго времени суток smile

Делаю такстовый редактор с подсветкой синтаксиса для самодельного скриптового языка. Решил сделать открытие каждого файла в отдельной закладке. Вот что у меня есть :
Код

private void toolStripButton1_Click(object sender, EventArgs e) //создание чистого документа
        {
            TabPage page = new TabPage("Noname"+((tabControl1.TabPages.Count+1)).ToString());
            page.Name = "Noname" + ((tabControl1.TabPages.Count + 1)).ToString();
            tabControl1.TabPages.Add(page);
            tabControl1.SelectedTab = page;

            RichTextBox edit = new RichTextBox();
            edit.Dock = DockStyle.Fill;
            edit.Enter += new EventHandler(edit_Enter);
            edit.BackColor = System.Drawing.SystemColors.InactiveCaption;
            edit.Name ="rich-"+page.Name;
            page.Controls.Add(edit);
            
        }

        void edit_Enter(object sender, EventArgs e) // как я понял надо чтото в этом роде сделать для сохранения :(
        {
            MessageBox.Show(((RichTextBox)sender).Name);
        }

Как мне сделать сохранение документа с RichTextBox'a в активной закладке? У меня не получается получить сам объект при смене закладки...нашел только при условии что он является сендером
Код

((RichTextBox)sender).Name

я уже пытался (может это и тупо конечно =\) давать закладке и ричу в ней одинаковые имена , но ричу подставлял суффик, но обращение типа
Код

object asd="Rich"+tabControl1.SelectedTab.Name;
MessageBox.Show(this.Controls[asd].Name);

выдавало ошибку, мол, нет ссылки на объект.

Смотрел рефлектором похожий блокнот...там через хэш массив обращались к ричам...но когда я попробовал сделать анологично, мне тоже начало кричать что нет ссылки на объект. :(

Автор: elbjarn 11.10.2008, 11:01
Цитата(xa3apg @  11.10.2008,  09:29 Найти цитируемый пост)
я уже пытался (может это и тупо конечно =\) давать закладке и ричу в ней одинаковые имена , но ричу подставлял суффик, но обращение типа
Выделить всёкод C#
1:
2:
    
object asd="Rich"+tabControl1.SelectedTab.Name;
MessageBox.Show(this.Controls[asd].Name);

выдавало ошибку, мол, нет ссылки на объект.


это потому, что this - ссылка на Form. В ее коллекции контролов не содержится ваших ричей, там находятся только TabPage, в коллекции контролов которых, в свою очередь, находится искомый ричтектсбокс.
Код

RichTextBox rtb = (RichTextBox)(tabControl1.SelectedTab.Controls["rich-" + tabControl1.SelectedTab.Name]);

это если делать по вашему пути, искать в коллекции контролов по имени. 
можно сделать небольшой словарик, где ключи будут - ссылки на TabPage, а значения - ссылки на RichTextBox.
но лучше всего - унаследовать контрол от TabPage, в этом контроле определить RichTextBox, и сделать метод у TabPage, типа Save(), который сохраняет содержимое RichTextBox.

Автор: xa3apg 14.10.2008, 10:35
Цитата(elbjarn @  11.10.2008,  11:01 Найти цитируемый пост)
но лучше всего - унаследовать контрол от TabPage, в этом контроле определить RichTextBox, и сделать метод у TabPage, типа Save(), который сохраняет содержимое RichTextBox.

То что надо. Сделал класс от TabPage и в нем создал контрол, теперь сохраняет нормально. Только встал другой вопрос :
хочу чтобы в тексте закладки при модификации текста подставлялся знак "*" в конце имени файла, а при сохранении убирался. Вроде сделал:
создал 
Код

private bool txtChanged = false ; 

в TextChanged класс добавил :

Код


if (!txtChanged)
{
Tab1.Text = info.Name + "*"; // info.Name - просто откидывает полный путь к файлу и оставляет только название
txtChanged = true;
}


С новыми документами работает прекрасно, но вот когда я открываю какой-либо готовый скрипт, то мне моментально ставится звездочка в имени (я то понимаю что он выполняется при создании ричбокса, и уже добавление текста с файла считает модификацией). Пытаюсь в открытии принудительно ставить 
Код

txtChanged =  true;

но он как будто его не замечает  smile 

Автор: elbjarn 14.10.2008, 11:31
Цитата(xa3apg @  14.10.2008,  10:35 Найти цитируемый пост)
Пытаюсь в открытии принудительно ставить 
Выделить всёкод C#
1:
    
txtChanged =  true;

но он как будто его не замечает  smile 


проблема решилась бы, если бы вы использовали вместе с  полем txtChanged пару функций, к примеру, SetAsteriskName() и SetClearName(). в этих функциях, соответственно, вы изменяете имя закладки на зведочку или без звездочки. функции эти вызывать при TextChanged у ричтекстбокса и при вызове Save(). только чтобы не обновлять при каждом вводе символа название закладки, как раз-таки проверять значение поля txtChanged,  или если оно true, то не вызывать функцию.
примерно так (код пишу от руки):
Код

public void Save()
{
  // здесь сохранить текст
  SetClearName();
}
bool txtChanged = false;
protected void TextChanged(sender e, EventArgs e)
{
  // здесь сохранить текст
  if (!txtChanged)
    SetAsteriskName();
}

public void SetClearText()
{
  // убрать звездочку

  txtChanged = false;
}


public void SetAsteriskText()
{
  // сделать зведочку

  txtChanged = true;
}


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)