На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Обязательно указание:
1) типа базы данных (Paradox/Oracle/Interbase и т.п.)
2) способа доступа к базе данных (ODBC/ADO/DAO/BDE и т.п.)
Например: Paradox/BDE, MS Access/ADO

Наиболее часто задаваемые вопросы:
Базы даных для начинающих. Первые шаги. Понятие о BDE.
Переход на клиент-сервер и начала ADO
Приёмы работы с BLOB (OLE/Memo) полями
Запросы и параметры или как избавиться от многих проблем. Проблемы с датами в запросах.
Нужели мне нужно устанавливать BDE? (или почему не работает программа на другом компьютере)
Модераторы: Bas, Rouse_
  
> Квадратики в ДБГриде
    Аксес/АДО

    заполняю я Мемо1 словестным предложением с использованием переноса несколько слов с помощью нажатия на Enter
    И сохраняю это предложение в таблицу БД Аксес в текстовое поле Name
    ExpandedWrap disabled
      ...
      AdoTable1.Append;
      AdoTable1.FieldByName('Name').Value:=Memo1.Text;
      AdoTable1.Post;
      ...

    и после этого он отображается в ДБГриде с прямоугольничками в том месте где нажимался Enter для перехода в Мемо на новую строку. Как можно избавиться от этого визуального дефекта в ДБГриде???
      В дбгрид у тебя однострочный текст, так что о каких Enter может идти речь.
      Можно заменить на пробелы
      Сообщение отредактировано: Anatoly Podgoretsky -
        Цитата Anatoly Podgoretsky @
        так что о каких Enter может идти речь.

        к примеру я в Мемо1 ввожу
        user posted image

        сохраняю и ДБГриде получаю
        user posted image

        Цитата Anatoly Podgoretsky @
        Можно заменить на пробелы

        т.е. символ перехода на новую строку заменить на пробел???
          Цитата olga90 @
          т.е. символ перехода на новую строку заменить на пробел???

          Конечно, только не символ, а символы - это пара #13#10
            Цитата Anatoly Podgoretsky @
            Можно заменить на пробелы

            Цитата Anatoly Podgoretsky @
            только не символ, а символы - это пара #13#10

            спасибо - получилось :yes:

            Добавлено
            Anatoly Podgoretsky, кстати а почему именно пара #13#10, а не просто #13 как в других языках
              Цитата olga90 @
              кстати а почему именно пара #13#10, а не просто #13 как в других языках

              к языкам - это не имеет никакого отнашения. С Windows принято строки разделять символами парой #13#10, а, например, в Linux #13. Другое дело, что многие стандартные процедуры во многих языках вопринимают и такой и сякой разделитель..
                Немного ошибся, это в Макинтош, в Линуксе #10
                  а как мне заменить при сохранении в таблицу сразу два параметра, т.е. и символы все #13#10 заменить на пробел и символ ### на <Formula>
                  если писать так
                  ExpandedWrap disabled
                    ...AdoTable1.Append;
                    AdoTable1.FieldByName('Name').Value:=StringReplace(Memo1.Text, '###','<Formula>', [rfReplaceAll]);
                    AdoTable1.FieldByName('Name').Value:=StringReplace(Memo1.Text, #13#10,' ', [rfReplaceAll]);
                    AdoTable1.Post;
                    ...

                  то выполняется только последняя строчка по замене <_<
                  Сообщение отредактировано: olga90 -
                    Anatoly Podgoretsky угу.

                    Добавлено
                    Цитата olga90 @
                    то выполняется только последняя строчка по замене <_<

                    И что, не уж то нет никаких соображений, почему не работает??
                      Цитата jack128 @
                      И что, не уж то нет никаких соображений, почему не работает??

                      ну хотя бы намекните куда глядеть <_<
                        Цитата olga90 @
                        то выполняется только последняя строчка по замене

                        А подумать?

                        Добавлено
                        Цитата olga90 @
                        ну хотя бы намекните куда глядеть

                        Глядеть первую и вторую строку, до просветления.
                        Кстати это неправильно в базе менять, надо менять только отображение в сетке.
                        Сообщение отредактировано: Anatoly Podgoretsky -
                          Цитата Anatoly Podgoretsky @
                          Кстати это неправильно в базе менять, надо менять только отображение в сетке.

                          это я переделаю :yes:
                          Цитата Anatoly Podgoretsky @
                          А подумать?

                          а что здесь думать - оно и понятно что будет сохраняться в таблицу последняя из строк содержащих
                          AdoTable1.FieldByName('Name').Value:=

                          а вот как сделать что бы можно было сразу две??? :huh:

                          Добавлено
                          Цитата Anatoly Podgoretsky @
                          Кстати это неправильно в базе менять, надо менять только отображение в сетке.

                          хотела сделать как вы мне посоветовали, но как ни делаю у меня только лишь заменяются символы прямо в таблице БД :wall: , а как сделать нужное отображение только в сетке не меняя данных в таблице БД

                          Добавлено
                          Ну раз никто не хочет говорить как мне это сделать :rolleyes:

                          тогда я думаю сделать так:
                          1) просто заменить при сохранении в таблицу все символы #13#10 заменить на пробел вот так
                          ExpandedWrap disabled
                            ...
                            AdoTable1.Append;
                            AdoTable1.FieldByName('Name').Value:=StringReplace(Memo1.Text, #13#10,' ', [rfReplaceAll]);
                            AdoTable1.Post;
                            ...


                          2)А уже в самой сетке менять отображение символов ### на <Formula>

                          Подскажите пожалуйста как мне сделать второй пункт
                            Цитата olga90 @
                            хотела сделать как вы мне посоветовали, но как ни делаю у меня только лишь заменяются символы прямо в таблице БД , а как сделать нужное отображение только в сетке не меняя данных в таблице БД

                            OnGetText для поля
                              Цитата Anatoly Podgoretsky @
                              OnGetText для поля

                              а что в нем писать???

                              пишу
                              ExpandedWrap disabled
                                procedure TForm.ADOTable1NameGetText(Sender: TField;
                                  var Text: String; DisplayText: Boolean);
                                begin
                                AdoTable1.FieldByName('Name').Value:=StringReplace(AdoTable1.FieldByName('Name').Value, '###','<Formula>', [rfReplaceAll]);
                                end;

                              проект не компилится - ошибка
                              Цитата
                              AdoTable1: Dataset not in edit or insert mode
                                Цитата olga90 @
                                Цитата
                                AdoTable1: Dataset not in edit or insert mode

                                AdoTable1.Edit
                                  Цитата Bas @
                                  AdoTable1.Edit


                                  если так
                                  ExpandedWrap disabled
                                    procedure TForm.ADOTable1NameGetText(Sender: TField;
                                      var Text: String; DisplayText: Boolean);
                                    begin
                                    AdoTable1.edit;
                                    AdoTable1.FieldByName('Name').Value:=StringReplace(AdoTable1.FieldByName('Name').Value, '###','<Formula>',
                                    [rfReplaceAll]);
                                    end;


                                  то поле Name cтановится вообще без записей - все записи поля Name пусты
                                    Цитата olga90 @
                                    то поле Name cтановится вообще без записей - все записи поля Name пусты

                                    Первый параметр в StringReplace это const переменная поэтому, введи еще одну переменную.
                                      Цитата Bas @
                                      Первый параметр в StringReplace это const переменная поэтому, введи еще одну переменную.

                                      какую ??? <_<
                                      и куда именно???
                                        Цитата olga90 @
                                        procedure TForm.ADOTable1NameGetText(Sender: TField;
                                        var Text: String; DisplayText: Boolean);
                                        begin
                                        AdoTable1.edit;
                                        AdoTable1.FieldByName('Name').Value:=StringReplace(AdoTable1.FieldByName('Name').Value, '###','<Formula>',
                                        [rfReplaceAll]);
                                        end;


                                        Млин. Ну как можно писать программу, абсолютно не понимая, что пишешь и что все это значит?!

                                        ExpandedWrap disabled
                                          procedure TForm.ADOTable1NameGetText(Sender: TField;
                                            var Text: String; DisplayText: Boolean);
                                          begin
                                            if not DisplayText then exit;
                                            Text := StringReplace(Text, '###','<Formula>', [rfReplaceAll]);
                                            Text := StringReplace(Text, #13#10,' ', [rfReplaceAll]);
                                          end;


                                        PS. Не программируй больше, хорошо?
                                        Сообщение отредактировано: Romkin -
                                          Цитата Romkin @
                                          PS. Не программируй больше, хорошо?
                                          так тоже нельзя.
                                          скажем так, почитаи умные книжки.
                                            Romkin, спасибо за советы ;)
                                              Цитата Romkin @
                                              PS. Не программируй больше, хорошо?

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

                                              единственное, что меня огорчает - Ольга взялась за тяжкий для нее проект. нужно начинать с более простого.
                                                olga90 Прошу прощения.
                                                Достаточно резко, но не удержался. Явно видно, что ты еще не привыкла мыслить в терминах алгоритма, и торопишься сделать достаточно сложную программу.
                                                Давай договоримся: увидела новый метод (или слово) - прочитай в справке, что написано о его параметрах. Как правило, этого достаточно. Если трудности с английским - есть переводчики и словари, а там и понимать начинаешь. Может быть, это дольше, чем спрашивать здесь, но это приносит очень большую пользу: то, что сказали здесь забудешь быстро, а найденное самостоятельно запомнится.
                                                И советую иногда проходить пошагово программу, отладчик хороший, и надо им пользоваться. Например, сообщения #8 вообще могло не быть, при отладке будет явно видно, что происходит. Стоит только мышку навести и посмотреть значение :)
                                                  Цитата Romkin @
                                                  Давай договоримся: увидела новый метод (или слово) - прочитай в справке, что написано о его параметрах. Как правило, этого достаточно. Если трудности с английским - есть переводчики и словари, а там и понимать начинаешь. Может быть, это дольше, чем спрашивать здесь, но это приносит очень большую пользу: то, что сказали здесь забудешь быстро, а найденное самостоятельно запомнится.

                                                  полностью согласна :yes:

                                                  Цитата Romkin @
                                                  И советую иногда проходить пошагово программу, отладчик хороший, и надо им пользоваться. Например, сообщения #8 вообще могло не быть, при отладке будет явно видно, что происходит. Стоит только мышку навести и посмотреть значение

                                                  а как в делфях пользоваться дебагером??? - так же с помощью брекпоинта как и в VB???
                                                    Цитата olga90 @
                                                    а как в делфях пользоваться дебагером??? - так же с помощью брекпоинта как и в VB???

                                                    Ну и не только. Посмотри меню Run. F8 - пошагово без захода в вызываемые процедуры, F7 - с заходом, F4 - выполнить до курсора. Брекпоинт ставится/убирается просто щелчком на синей точке, для него еще и условие останова можно ставить. Быстрый просмотр значения - останови выполнение и наведи мышку. Отслеживание значения - пункт View -> Debud windows -> Watches (там и брекпоинты все посмотреть можно)
                                                    И так далее. Вообще говоря, во многих книгах есть главы по использованию трассировки.
                                                      вот ты отредактировал свой пост, где первоначально было
                                                      ExpandedWrap disabled
                                                        Text := StringReplace(Sender.asString, '###','<Formula>', [rfReplaceAll]);
                                                        Text := StringReplace(Text, #13#10,' ', [rfReplaceAll]);


                                                      а изменил на
                                                      ExpandedWrap disabled
                                                        Text := StringReplace(Text, '###','<Formula>', [rfReplaceAll]);
                                                        Text := StringReplace(Text, #13#10,' ', [rfReplaceAll]);


                                                      т.е. ты заменил в своем коде в первой строке Sender.asString на Text
                                                      но при втором измененном варианте все записи в поле ДБгрида становятся Пусты
                                                      а при первом все просто замечательно :yes:

                                                      1) Как это можно объяснить??? <_<

                                                      2) И т.к. у меня не простой ДБГрид, а ТНТДБГрид, то символы стали отображаться вопросительными знаками :wall: . Как от этого избавиться???
                                                        olga90 Хм. Перебдел, однако. Написал, а потом показалось, что в Text уже подан asString, при входе в процедуру, тогда второй раз его брать не надо. Можешь поставить брекпоинт и посмотреть ;)
                                                        Пишу же код по памяти, как правило, так что косяки еще и не такие могут быть.
                                                        Цитата olga90 @
                                                        2) И т.к. у меня не простой ДБГрид, а ТНТДБГрид, то символы стали отображаться вопросительными знаками . Как от этого избавиться???

                                                        А вот это уже хуже. Все символы? Вопросительные знаки - это юникод откуда-то взялся. Примерно понимаю, откуда, но тогда лучше GetText не пользоваться...

                                                        Добавлено
                                                        А в обычном гриде все правильно показывается?
                                                          Цитата olga90 @
                                                          2) И т.к. у меня не простой ДБГрид, а ТНТДБГрид, то символы стали отображаться вопросительными знаками . Как от этого избавиться???
                                                          сначало обяви переменную
                                                          ExpandedWrap disabled
                                                            Text: WideString;
                                                          потом передаи ему твои текст. ну а далше как Romkin скозал. точно не помню но кажется в деваге всеравно ??? пишет. завтра проверью, скажу.
                                                          и вообше, делфи не дружит с WideString-ом, так что не все методы с ним умеют работать. да ещо много чего. по этому мы придумали сделать функцию, которая переводит коды зоны 129-255 в коды уникода. обратную кажис не делали, пока не нужно.

                                                          Добавлено
                                                          да ещо, из за проблем с уникодом, последние два проекта сделал в делфи под нет, но тепер приняли решение что когда будет следуищи проект, делать будем на шарпе. olga90 рас ты работаеш с уникодом, советую 2006 делфи, проект вин форм под нет. некоторые баги я научилься обходить, но может они тебе и не встретятся.
                                                            Delphi OnGetText - var Text: String;
                                                            Tnt OnGetText - TFieldGetWideTextEvent = procedure(Sender: TField; var Text: WideString;
                                                            DoDisplayText: Boolean) of object;

                                                            Работать с TNT надо осторожно, не путать с Дельфи, где надо делать приведение. Тогда все будет в порядке. Но начинающим это тяжело.

                                                            WS := 'йцукенг' вроде все нормально, но так писать нельзя, а надо так WS := WideString('йцукенг') и так во многих случаях.

                                                            Для Юникод StringReplace использовать нельзя, надо использовать подпрограммы из TNT - WideStringReplace, иначе будет ерунда. И так везде. Вот когда string будет равным WideString или будет перекрытая версия, тогда пожалуйста.

                                                            Кстати я в свое время много времени потратил на Ольгу по части просвещения в TNT но пока вижу не в толк, дело усугляет нежелание использовать только TNT компоненты, в программе солянка из TNT и обычных компонент. Проще перейти на Delphi.NET - там изначально Юникод и string = WideString, чем познавать тонкости TNT, там нужна аккуратность и понимание сущности Юникод и TNT.

                                                            Добавлено
                                                            ExpandedWrap disabled
                                                              сначало обяви переменную
                                                              Text: WideString;


                                                            Не поможет, нет перекрытой версии StringReplace
                                                            Сообщение отредактировано: Anatoly Podgoretsky -
                                                              Цитата Anatoly Podgoretsky @
                                                              Не поможет, нет перекрытой версии StringReplace
                                                              значит и этои функции нет. в принципе можно и самому написать. но конечно наилущи вариант сменить среду разработки.
                                                                Цитата Kobra @
                                                                значит и этои функции нет. в принципе можно и самому написать

                                                                Зачем писать, то что уже написано, у нее используется пакет TNT, там есть почти все необходимое для полноценной работы с Юникод, но так как это халява, то никакой документации, все расскапывать самому по исходникам и методом проб и ошибок. Простым бросанием компонент на форму не обойтись.
                                                                WideStringReplace очень простая функция и все различие в том, что вместо String используется WideString
                                                                  Цитата Romkin @
                                                                  увидела новый метод (или слово) - прочитай в справке, что написано о его параметрах.

                                                                  а есть версии русского Help'a ???

                                                                  Цитата Romkin @
                                                                  Все символы?

                                                                  только символы юникода
                                                                  Цитата Romkin @
                                                                  А в обычном гриде все правильно показывается?

                                                                  правильно :yes:

                                                                  Цитата Anatoly Podgoretsky @
                                                                  ExpandedWrap disabled
                                                                    TFieldGetWideTextEvent = procedure(Sender: TField; var Text: WideString; DoDisplayText: Boolean) of object;

                                                                  как ни пишу все равно ругается :wall:

                                                                  хотела сделать так
                                                                  ExpandedWrap disabled
                                                                    ...
                                                                    var
                                                                    myText : widestring;
                                                                    begin
                                                                    myText := Text as widestring;

                                                                  ругается :(
                                                                  Цитата
                                                                  [Error] MainUnit.pas(1032): Operator not applicable to this operand type


                                                                  Цитата Anatoly Podgoretsky @
                                                                  WideStringReplace очень простая функция и все различие в том, что вместо String используется WideString

                                                                  если ее писать вместо StringReplace, то компилятор ругается так
                                                                  Цитата
                                                                  [Error] MainUnit.pas(1036): Undeclared identifier: 'WideStringReplace'


                                                                  Цитата Kobra @
                                                                  olga90 рас ты работаеш с уникодом, советую 2006 делфи,

                                                                  Цитата Anatoly Podgoretsky @
                                                                  Проще перейти на Delphi.NET - там изначально Юникод и string = WideString, чем познавать тонкости TNT, там нужна аккуратность и понимание сущности Юникод и TNT.

                                                                  пока нет возможности перехода на них :no:
                                                                  Сообщение отредактировано: olga90 -
                                                                    что посоветуете мне делать??? <_<
                                                                      Цитата olga90 @
                                                                      Цитата (Anatoly Podgoretsky @ Вчера, 09:01)
                                                                      WideStringReplace очень простая функция и все различие в том, что вместо String используется WideString

                                                                      если ее писать вместо StringReplace, то компилятор ругается

                                                                      Эта функция называется Tnt_WideStringReplace, и для ее использования достаточно подключить модуль TntSysUtils...
                                                                        Цитата volvo877 @
                                                                        Эта функция называется Tnt_WideStringReplace, и для ее использования достаточно подключить модуль TntSysUtils...

                                                                        при
                                                                        ExpandedWrap disabled
                                                                          begin
                                                                          if not DisplayText then exit;
                                                                            Text := Tnt_WideStringReplace(Sender.asString, '###','<Formula>', [rfReplaceAll]);
                                                                            Text := Tnt_WideStringReplace(Text, #13#10,' ', [rfReplaceAll]);
                                                                          end;

                                                                        тоже самое :( - знаки вопроса
                                                                          Цитата olga90 @
                                                                          тоже самое :angry: - знаки вопроса
                                                                          ExpandedWrap disabled
                                                                            procedure TForm.ADOTable1NameGetText(Sender: TField;
                                                                              var Text: String; DisplayText: Boolean);
                                                                          обрати внимание var Text: String; так что нечего удивителного. этот метод тебе не подходит, будет луще работать с вычисляемими полями.
                                                                            И одновременно надо обратить внимание на ее версию из TNT
                                                                            procedure TForm.ADOTable1NameGetText(Sender: TField; var Text: WideString; DisplayText: Boolean);
                                                                              Anatoly Podgoretsky где его реализация? не нашол.
                                                                                Цитата Anatoly Podgoretsky @
                                                                                И одновременно надо обратить внимание на ее версию из TNT
                                                                                procedure TForm.ADOTable1NameGetText(Sender: TField; var Text: WideString; DisplayText: Boolean);

                                                                                а у меня просто String :(

                                                                                а свой не получается сделать
                                                                                ExpandedWrap disabled
                                                                                  var
                                                                                  myText : widestring;
                                                                                  begin
                                                                                  myText := Text as widestring; //здесь ругается
                                                                                  Цитата Kobra @
                                                                                  Anatoly Podgoretsky где его реализация? не нашол.

                                                                                  В однои из модулей TNT
                                                                                  в каком точно не помню, но пользоваться можно и текущим обработчиком, с приведением типа, если почему то правильный обработчик не будет построен.
                                                                                    setStructureFactory(flagForceRefresh boolen)
                                                                                      olga90
                                                                                      у тебя вот была проблема в отображении в DBGrid'е #13#10...
                                                                                      но замена #13#10 на пробел не вижу смысла, потому как при заполнении что так сложно самому поставить пробел, чем потом делать замену....
                                                                                      народ, у меня проблема в следующем:
                                                                                      у меня при заполнении данных есть #13#10, тоесть я переношу данные на новую стоку, но вот в чём проблема, в гриде отображаютсчя квадраты, если заменять их на пробел, то получается что текс, идёт сплошным текстом, а мне нужно чтобы каждая запись начиналась с новой строки... как сделать так, чтобы каждая запись начиналась с новой строки, но в гриде было в одну строку и без квадратов?
                                                                                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                                                                      0 пользователей:


                                                                                      Рейтинг@Mail.ru
                                                                                      [ Script execution time: 0,0964 ]   [ 16 queries used ]   [ Generated: 18.07.25, 15:58 GMT ]