Есть функция task1() которая возвращает массив, и передает кнопке, которая в свою очередь передает его textBox .

В данный момент у меня выводится первый элемент массива.

Вопрос: как мне вывести весь массив?

Так как на курсах нам еще не говорили что такое ООП и классы. Мне надо просто шаблон.

Хочу преподу домашку отправлять в нормальном виде, а не по 10 разных сорс файлов.

1 ответ 1

В данном случае delete не сработает, так как после return , происходит выход из функции.

Тип возврата из функции у вас int , однако на деле вы возвращаете указатель return arrCPtr; , который имеет тип int*

Чтобы вывести в textBox все значения переменных, вам нужно не просто сконвертировать в строку возвращённое значение, а предварительно склеить их в одну строку, например таким образом:

На микроконтроллер посылаю посылку вида byte [] writestring = <0x10, 0x03, 0x00, 0x04, 0x00, 0x04, 0x06, 0x89>
Должен принять ответ и вывести в текст бокс, ответ должен быть следующим 10 03 08 14 00 3D 00 66 00 8F 00 BB 4.

Проблема в следующем, иногда ответ приходит корректный, а иногда в ответную посылку замешиваются непонятные нули. Т.е. иногда ответ нормальный приходит, иногда нет. Зависимости не нашел, думаю может это из-за конвертации. Подскажите пожалуйста, из-за чего это может быть.

Параграф 1. Вывод текстовой информации в контрол Label

Для вывода текстовой информации наиболее часто применяются контролы Label и TextBox, которые мы уже использовали в параграфе "Простейший Windows Application проект". Контрол TLabel предназначен для вывода однострочной текстовой информаци и имеет стандартный набор свойств и методов, большинство из которых прозрачны или описаны в предыдущих параграфах.

Отметим, что в контрол можно помещать не только текст, но, чего нет в Delphi и Borland C++ Builder, и рисунки, аналогично, как это мы делалали для кнопок — он имеет такойже набор свойств(Image, ImageAlign, ImageList).

Интересным является свойство UseMnemonic, позволяющее определить, как будет интерпретироваться символ амперсанда (&), размещенный в свойстве Text. Если установлено значение True, то амперсанд из текста удаляется, а символ, перед которым он расположен, подчеркивается. Эта возможность применяется для определения клавиш быстрого доступа для выбора именно контрола Label — пользователь может комбинацией клавиш + устанавливать фокус на контрол, а затем, используя клавишу Tab, на контрол, следующий по таб номеру за контролом Label. Например, если в форме расположено несколько контролов, среди которых имеется текстовое поле, в которое необходимо перейти нажатием клавиши быстрого доступа, то достаточно установить свойства Tabindex метки и текстового поля так, чтобы для метки это значение было на единицу меньшее, чем у текстового поля. Теперь, в программе, Вы можете выбрать клавишами быстрого доступа метку и, далее, нажать клавишу Tab — будет выбрано текстовое поле для ввода информации.

Вывод текста в контрол не вызывает трудностей, для этого контрол имеет свойство Text:

Параграф 2. Вывод текстовой информации в контрол TextBox

2.1. Основные свойства TextBox

Контрол TextBox мы пока использовали для ввода и вывода однострочного текста, однако он болле предназначен именно для ввода и вывода многострочного текста. Для этого у него есть свойство Multiline, которое должно быть установлено в True.

Cвойства AcceptsTab и AcceptsReturn определяют действие при нажатии клавиш Tab и Enter, при False (по умолчанию) и при нажатии Tab или Enter осуществляется переход фокуса к следующему по TabIndex контролу, при True — клавиши выполняют основное свое назначение — вставка разрыва табуляции и перевод строки соответственно.

Cвойство AutoSize определяет, нужно ли автоматически изменять размеры конрола, чтобы в нем можно было разместить его содержимое.

Свойство CharacterCasing определяет регистр в котором будут отображаться техт в контроле.

Свойство HideSelection целесообразно установить в False — в противном случае выделенный программно текст не будет отображаться.

Свойство Locked определяет может ли пользователь изменять свойства TextBox программно.

Свойство ScrollBars показывает положение полос прокрутки — при Both полоса прокрутки появляется при выходе текста за соответствующую границу.

Свойство PasswordChar (работает только при Multiline=false) не дает возможности просматривать вводимые символы, заменяя их на привычные для ввода пароля звездочки или другой символ, указанный в этом поле.

Свойство WordWrap при True разрешает перенос текста на новую строку при ширене строки текста более ширины окна.

2.2. Программный вывод текста в TextBox

Создадим проект решения для вывода текстовой информации с контролом TrxtBox, показанный на Рис.1.

Рис.1. Проект решения для вывода текстовой информации

Создание кнопочной панели, меню и панели статуса уже рассмотрены в предыдущих параграфах раздела, поэтому здесь приводятся лиш коды обработчиков событий для кнопок. У кнопок установлено свойство Tag соответственно в 1, 2 и 3 и события MouseHover и MouseLeave для всех кнопок замкнуты на toolStripButton1_MouseHover и toolStripButton1_MouseLeave. Для вывода подсказок использован контрол toolStrip, а для вывода подсказок в панель статуса StatusStrip и соответствующий код (все тонкости описаны в предыдущих параграфах).

Прежде чем выводить текст программно, нажмем кнопочку с тремя точками в свойстве Lines (вызов String Coleection Editor) и выведем несколько строк текста с клавиатуры. После нажатия кнопочки OK видим, что текст появился в окне контрола и в свойстве Text. Это говорит о том, что текст можно выводить как в свойство Text, так и использовать свойство Lines (String[] Array). Обратим внимание, что в свойстве Text присутствуют два нечитаемых символа — это
и
— перевод строки и возврат каретки. К сожалению, из за этого, придется при редактировани текста учитывать наличие этих символов. У свойства Lines нет методов Add и Delete для строк, что также создает дополнительные трудности при редактировании текста.

Перед началом манипулирования с текстом определим статическую переменную viNom в декларационной части кода:

Следующие коды обработчиков событий нажатия для кнопок показывают возможности редактирования многострочного текста. Раскоментируйте интересующий Вас способ.

Нажимаем F5 и можем добавлять и удалять строки в TextBox.

Рис.2. Демонстрация добавления и удаления строк

Удалять строки можно и так (ровно как добавлять и вставлять):

Параграф 3. Ввод/Вывод текстовой информации в контрол TextBox из/в файл(а)

3.1. Классы для работы с текстовыми файлами

Для работы с текстовыми файлами удобно использовать потоки и класс потоков, наследника класса Stream — Класс FileStream.

Класс FileStream используется для чтения и записи файлов. Его можно использовать для чтения и записи байтов, символов, строк и других типов данных. Класс FileStream поддерживает синхронное и асинхронное открытие файлов, синхронные операции чтения и записи (методы Read и Write), а также асинхронные операции чтения и записи (методы BeginRead и BeginWrite). Асинхронные операции завершаются вызовом методов EndRead и EndWrite соответственно. Режим по умолчанию — синхронный. Для проверки режима используемтсясвойство класса IsAsync. Для асинхронных операций необходим объект WaitHandle. Метод Seek используется для произвольного доступа к файлам. Свойство Position позволяет нам узнать или установить текущую позицию в потоке. Методы Lock и Unlock служат для предотвращения доступа ко всему файлу или к его части, а также для отмены ранее установленного запрета доступа. Свойство Length возвращает длину потока в байтах, а метод SetLength служит для задания длины потока. Методы ReadByte и WriteByte используются для чтения и записи одного байта. Для других примитивных типов необходимы классы BinaryReader и BinaryWriter соответственно.

Удобно использовать для работы с текстовыми файлами в дополнение к классу FileStream классы TextReader, TextWriter StreamReader, StreamWriter, StringReader и StringWriter.

Класс TextReader используется для чтения последовательности символов из ассоциированного потока. Этот класс служит основой для двух других классов: StreamReader и StringReader.

Класс TextReader содержит следующие методы:

    Peek() — возвращает следующий символ из потока, но не перемещает указатель текущей позиции;

    Read() или Read(Char(), Integer, Integer) — метод применяется для чтения указанного числа символов из потока;

    ReadBlock(Char(), Integer, Integer) — метод считывает указанное число символов в буфер;

    ReadLine() — считывает строку символов из потока;

    ReadToEnd() — считывает все символы с текущей позиции до конца потока как одну строку.

    Класс TextWriter служит для записи последовательности символов в поток.

    Класс StreamReader применяется для чтения последовательности символов из файла или другого потока. Его можно использовать для чтения текстового файла построчно и как одну строку.

    Класс StringReader позволяет выполнить чтение символов из строк. StreamReader и StringReader для чтения строки из текстового файла и чтения символов из этой строки как из потока:

    Класс StreamWriter применяется для вывода последовательности символов в той или иной кодировке. По умолчанию используется экземпляр класса UTF8Encoding для записи символов в кодировке Unicode UTF-8. Существует несколько перегруженных конструкторов, позволяющих указать поток, кодировку по умолчанию, задать кодировку, размер буфера и тип операции: требуется перезаписать существующий файл или информация должна быть к нему добавлена. Свойство Flush служит для указания, следует ли записывать содержимое буфера в поток после каждого вызова методов Write и WriteLine.

    Класс StringWriter используется для записи строки, которая хранится в классе StringBuilder, реализованном в пространстве имен System.Text.

    3.2. Ввод/Вывод текстовой информации

    Покажем возможные способы использования перечисленных классов для ввода и вывода информации в TextBox.

    Используем для реализации проект решения из предыдущего параграфа. Для чего уберем имеющийся код из обработчиков toolStripButton1_Click и toolStripButton2_Click. При желании можем изменить тексты подсказок и картинки для button1 и button2 и заглавие проекта.

    В обработчики нажатия кнопок toolStripButton2_Click и toolStripButton2_Click запишем следующий код:

    Проверим в заголовке наличие кода using System.IO; :

    После выполнения программы введенный в контрол TextBox текст будет записан в файл по нажатию toolStripButton1_Click и добавлен к введенному из файла по нажатию toolStripButton2_Click.

    Следующий код (изменим обработчик для кнопки 2) позволяет вывести текст по линиям. На этом принципе может быть также основан вывод конкретной строки текста.

    Когда необходимо чтение всего текста, то код можно упростить.

    Изменим теперь обработчик для кнопки 1

    Теперь при запуске прграммы мы можем ввести какой либо текст в TextBox и, далее, после нажатия последовательно кнопок 1 и 2 его вывести c заголовком ("My Strings!!"). Этот код показывает как можно добавлять строки в текстовый файл.

    Добавим в заголовок решения строку:

    Изменим текст обработчика кнопки 1 для вывода чисел в текстовый файл:

    Результат после последовательного нажатия кнопок 1 и 2:

    Параграф 4. Вывод текстовой информации в контрол RichTextBox

    4.1. Основные свойства RichTextBox

    Вначале изменим предыдущее решение удалив коды обработчиков событий нажатия Button1 и Button2, удалим контрол TextBox и на его место поместим контрол RichTextBox. Рассмотрим его свойство на страничке Properties. Большинство свойст аналогичны описанным ранее для уже рассмотренных контролов. Рассмотрим те свойства, которых не было у уже использованных нами контролов.

    Свойство AcceptButton позволяет закрепить кнопку, клик которой будет выполняться при нажатии Enter когда RichTextBox в фокусе (например после ввода).

    WordSelection если свойство true, пользователь может, двойным щелчком на любой части слова в контроле сделать его выделенным.

    BulletIndent и SelectionBullet — BulletIndent определяет отступ в пикселях текста перечислений (пунктов списка) от иконки соответствующей пункту списка при значении свойства SelectionBullet=true.

    Пример из Help С#:

    Рис.3. Свойства SelectionBullet и BulletIndent.

    Свойство DetectUrls позволяет распозновать и выделять интернетовские ссылки и запускать браузер по этой ссылке при наличии в решении кода обработчика события LinkClicked следующего вида (Рис.4.):

    Рис.4. Использование свойства DetectUrls

    Свойство ZoomFactor позволяет одновременно изменять масштаб вывода текста в RichTextBox в пределах значений 0.64 — 64.0.

    Свойство Ime Mode задает или возвращает состояние IME (Input Method Editor — IME — редактор способа ввода). Вместе со свойством RightToLeft определяют направление текста и способ его редактирования (свойства не актуальны для европейских языков, в том числе и для русского) — более необходимы при вводах иероглифических текстов на китайском, арабском, корейском и японском языках (при соответствующих Windows).

    Значение по умолчанию NoControl.

    Все остальные свойства richTextBox повторяют свойства TextBox.

    4.2. Программный вывод текста в RichTextBox

    В начале параграфа мы поместили контрол RichTextBox на форму.

    Все свойства контрола пока оставим принятые по умолчанию. Свойства остальных контролов оставим без изменения — проект решения выглядит аналогично показанному на Рис.1. При удалении контрола требуется только удалить коды обработчиков нажатия кнопок 1 и 2.

    Так как свойство Lines у RichTextBox и TextBox, то следует предположить, что ввод и вывод информации в контрол ничем не отличимы в обоих контролах — достаточно заменить имена, как показано далее в обработчиках toolStripButton1_Click и toolStripButton2_Click.

    Коды обсолютно одинаковы и работают аналогично (Рис.2.). Все отличие контролов в формате текста .rtf и .txt. RichTextBox, как мы это видели при описании свойств контрола, позволяет менять шрифты, и характеристики шрифтов, отступы, использовать интернет ссылки и т.п.

    Но прежде чем перейти к рассмотрению всех этих возможностей приведем еще один код (подходит и для работы с TextBox), который позволяет удалять строки несколько иначе и показывает, что с RichTextBox это, в отношении хранения информации — такойже массив как и string[]:

    4.3. Использование шрифтов в RichTextBox

    Изменим обработчик для кнопки 1 так, чтобы выводимые строки меняли свой шрифт при выводе очередной строки.

    Результат выполнения кода представлен на Рис.4.

    Рис.5. Задание параметров шрифтов для строк

    Обратм внимание, что любая попытка добавить текcт обычным образом приведет у тому, что весь текст отобразится шрифтом, установленным в свойстве Font RichTextEdit.

    В приведенном выше коде показно как добавить составляющую в стиль шрифта. Но соствляющие можно также и убирать. Добавим в конец предыдущего кода фрагмент:

    Результат — перечеркивания в пятой строке исчезло.

    4.4. Работа со строками в RichTextBox

    В предыдущем решении мы получили пятистрочный текст, который хорошо подходит для показа того, как можно менять местами, добавлять и удалять строки. Будем добавлять в обработчик нажатия кнопки 1 дополнительные фрагменты, на которых и рассмотрим работу со строками.

    Отметим сразу, что привычных для программистов методов, напрямую добавляющих, удаляющих или вставляющех строки в C# для RichEditBox, ровно как и для TextBox, нет. Как результат приходится работать через Clipboard. (Наличие метода Insert у свойства Text пусть никого не обольщает, его малая результативность будет показана чуть ниже).

    Изменим код в обработчике toolStripButton1_Click:

    Результат видим на Рис.6.(слева).

    Если вместо строчки кода

    Или вообще ее убрать, то строка 5 заместит строку 2 (Рис.6. справа).

    Рис.6. Манипулирование строками в RichTextBox

    Теперь о методе Insert. Рассмотрим фрагмент кода, который добавим в конец фрагмента кода, где мы экспирементировали со шрифтами:

    Все хорошо (Рис.7.) — строки поменяльсь местами и вставлена строка в нулевую позицию, но все форматирование исчезло. Причина — Text и отформатированный текст не одно и тоже. Текст хранится в свойстве Lines по строчно и в свойстве текст одной строкой, а отформатированный и отображаемый текст в формате Rtf в свойстве SelectedRtf.

    Рис.7. Манипулирование строками в RichTextBox

    Нетрудно посмотреть причину этого — достаточно добавить перед последнем вставленным фрагментом и в конце его код:

    и посмотреть результат в окне отладчика и сравнить коды (меню View/Output).

    Зная формат нетрудно найти все, что было введено при форматировании и потерялось при присвоении.

    Можно попробовать осуществить манипуляцию строками через посредника, например richTextBox2.

    Однако и это ничего хорошего не дает — при присвоении теряются форматы всех строк кроме первой, который становится форматом всего текста.

    4.5. Файловый ввод/вывод RichTextBox

    Рассмотрим фрагмент кода, который, как и прежде, поместим в конец кода обработчика toolStripButton3_Click:

    При запуске текст пишется из контрола в файл и читается из него в контрол благодаря наличию методов SaveFile и LoadFile. Причем формат тексты сохраняется.

    Как и большинства функций C# функции SaveFile и LoadFile перегружаемые и можно напрямую указать формат текста, например:

    Молчанов Владислав 15.07.2004г.

    Адаптировано к VS 2005 11.11.2006г.