
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.30] |
![]() |
|
Сообщ.
#1
,
|
|
|
Аксес/АДО
заполняю я Мемо1 словестным предложением с использованием переноса несколько слов с помощью нажатия на Enter И сохраняю это предложение в таблицу БД Аксес в текстовое поле Name ![]() ![]() ... AdoTable1.Append; AdoTable1.FieldByName('Name').Value:=Memo1.Text; AdoTable1.Post; ... и после этого он отображается в ДБГриде с прямоугольничками в том месте где нажимался Enter для перехода в Мемо на новую строку. Как можно избавиться от этого визуального дефекта в ДБГриде??? |
Сообщ.
#2
,
|
|
|
В дбгрид у тебя однострочный текст, так что о каких Enter может идти речь.
Можно заменить на пробелы |
Сообщ.
#3
,
|
|
|
Цитата Anatoly Podgoretsky @ так что о каких Enter может идти речь. к примеру я в Мемо1 ввожу сохраняю и ДБГриде получаю Цитата Anatoly Podgoretsky @ Можно заменить на пробелы т.е. символ перехода на новую строку заменить на пробел??? |
Сообщ.
#4
,
|
|
|
Цитата olga90 @ т.е. символ перехода на новую строку заменить на пробел??? Конечно, только не символ, а символы - это пара #13#10 |
Сообщ.
#5
,
|
|
|
Цитата Anatoly Podgoretsky @ Можно заменить на пробелы Цитата Anatoly Podgoretsky @ только не символ, а символы - это пара #13#10 спасибо - получилось ![]() Добавлено Anatoly Podgoretsky, кстати а почему именно пара #13#10, а не просто #13 как в других языках |
![]() |
Сообщ.
#6
,
|
|
Цитата olga90 @ кстати а почему именно пара #13#10, а не просто #13 как в других языках к языкам - это не имеет никакого отнашения. С Windows принято строки разделять символами парой #13#10, а, например, в Linux #13. Другое дело, что многие стандартные процедуры во многих языках вопринимают и такой и сякой разделитель.. |
Сообщ.
#7
,
|
|
|
Немного ошибся, это в Макинтош, в Линуксе #10
|
Сообщ.
#8
,
|
|
|
а как мне заменить при сохранении в таблицу сразу два параметра, т.е. и символы все #13#10 заменить на пробел и символ ### на <Formula>
если писать так ![]() ![]() ...AdoTable1.Append; AdoTable1.FieldByName('Name').Value:=StringReplace(Memo1.Text, '###','<Formula>', [rfReplaceAll]); AdoTable1.FieldByName('Name').Value:=StringReplace(Memo1.Text, #13#10,' ', [rfReplaceAll]); AdoTable1.Post; ... то выполняется только последняя строчка по замене ![]() |
![]() |
Сообщ.
#9
,
|
|
Anatoly Podgoretsky угу.
Добавлено Цитата olga90 @ то выполняется только последняя строчка по замене ![]() И что, не уж то нет никаких соображений, почему не работает?? |
Сообщ.
#10
,
|
|
|
Цитата jack128 @ И что, не уж то нет никаких соображений, почему не работает?? ну хотя бы намекните куда глядеть ![]() |
Сообщ.
#11
,
|
|
|
Цитата olga90 @ то выполняется только последняя строчка по замене А подумать? Добавлено Цитата olga90 @ ну хотя бы намекните куда глядеть Глядеть первую и вторую строку, до просветления. Кстати это неправильно в базе менять, надо менять только отображение в сетке. |
Сообщ.
#12
,
|
|
|
Цитата Anatoly Podgoretsky @ Кстати это неправильно в базе менять, надо менять только отображение в сетке. это я переделаю ![]() Цитата Anatoly Podgoretsky @ А подумать? а что здесь думать - оно и понятно что будет сохраняться в таблицу последняя из строк содержащих AdoTable1.FieldByName('Name').Value:= а вот как сделать что бы можно было сразу две??? ![]() Добавлено Цитата Anatoly Podgoretsky @ Кстати это неправильно в базе менять, надо менять только отображение в сетке. хотела сделать как вы мне посоветовали, но как ни делаю у меня только лишь заменяются символы прямо в таблице БД ![]() Добавлено Ну раз никто не хочет говорить как мне это сделать ![]() тогда я думаю сделать так: 1) просто заменить при сохранении в таблицу все символы #13#10 заменить на пробел вот так ![]() ![]() ... AdoTable1.Append; AdoTable1.FieldByName('Name').Value:=StringReplace(Memo1.Text, #13#10,' ', [rfReplaceAll]); AdoTable1.Post; ... 2)А уже в самой сетке менять отображение символов ### на <Formula> Подскажите пожалуйста как мне сделать второй пункт |
Сообщ.
#13
,
|
|
|
Цитата olga90 @ хотела сделать как вы мне посоветовали, но как ни делаю у меня только лишь заменяются символы прямо в таблице БД , а как сделать нужное отображение только в сетке не меняя данных в таблице БД OnGetText для поля |
Сообщ.
#14
,
|
|
|
Цитата Anatoly Podgoretsky @ OnGetText для поля а что в нем писать??? пишу ![]() ![]() 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 |
![]() |
Сообщ.
#15
,
|
|
Цитата olga90 @ Цитата AdoTable1: Dataset not in edit or insert mode AdoTable1.Edit |
Сообщ.
#16
,
|
|
|
Цитата Bas @ AdoTable1.Edit если так ![]() ![]() 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 пусты |
![]() |
Сообщ.
#17
,
|
|
Цитата olga90 @ то поле Name cтановится вообще без записей - все записи поля Name пусты Первый параметр в StringReplace это const переменная поэтому, введи еще одну переменную. |
Сообщ.
#18
,
|
|
|
Цитата Bas @ Первый параметр в StringReplace это const переменная поэтому, введи еще одну переменную. какую ??? ![]() и куда именно??? |
Сообщ.
#19
,
|
|
|
Цитата 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; Млин. Ну как можно писать программу, абсолютно не понимая, что пишешь и что все это значит?! ![]() ![]() 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. Не программируй больше, хорошо? |
Сообщ.
#20
,
|
|
|
Цитата Romkin @ так тоже нельзя.PS. Не программируй больше, хорошо? скажем так, почитаи умные книжки. |
Сообщ.
#21
,
|
|
|
Romkin, спасибо за советы
![]() |
Сообщ.
#22
,
|
|
|
Цитата Romkin @ PS. Не программируй больше, хорошо? обижаете. ну не понимает человек. опыта мало. мозг не привык к програмированию. ей нужно просто тренироваться и тренироваться, чтобы выработася правильный способ мышления. единственное, что меня огорчает - Ольга взялась за тяжкий для нее проект. нужно начинать с более простого. |
Сообщ.
#23
,
|
|
|
olga90 Прошу прощения.
Достаточно резко, но не удержался. Явно видно, что ты еще не привыкла мыслить в терминах алгоритма, и торопишься сделать достаточно сложную программу. Давай договоримся: увидела новый метод (или слово) - прочитай в справке, что написано о его параметрах. Как правило, этого достаточно. Если трудности с английским - есть переводчики и словари, а там и понимать начинаешь. Может быть, это дольше, чем спрашивать здесь, но это приносит очень большую пользу: то, что сказали здесь забудешь быстро, а найденное самостоятельно запомнится. И советую иногда проходить пошагово программу, отладчик хороший, и надо им пользоваться. Например, сообщения #8 вообще могло не быть, при отладке будет явно видно, что происходит. Стоит только мышку навести и посмотреть значение ![]() |
Сообщ.
#24
,
|
|
|
Цитата Romkin @ Давай договоримся: увидела новый метод (или слово) - прочитай в справке, что написано о его параметрах. Как правило, этого достаточно. Если трудности с английским - есть переводчики и словари, а там и понимать начинаешь. Может быть, это дольше, чем спрашивать здесь, но это приносит очень большую пользу: то, что сказали здесь забудешь быстро, а найденное самостоятельно запомнится. полностью согласна ![]() Цитата Romkin @ И советую иногда проходить пошагово программу, отладчик хороший, и надо им пользоваться. Например, сообщения #8 вообще могло не быть, при отладке будет явно видно, что происходит. Стоит только мышку навести и посмотреть значение а как в делфях пользоваться дебагером??? - так же с помощью брекпоинта как и в VB??? |
Сообщ.
#25
,
|
|
|
Цитата olga90 @ а как в делфях пользоваться дебагером??? - так же с помощью брекпоинта как и в VB??? Ну и не только. Посмотри меню Run. F8 - пошагово без захода в вызываемые процедуры, F7 - с заходом, F4 - выполнить до курсора. Брекпоинт ставится/убирается просто щелчком на синей точке, для него еще и условие останова можно ставить. Быстрый просмотр значения - останови выполнение и наведи мышку. Отслеживание значения - пункт View -> Debud windows -> Watches (там и брекпоинты все посмотреть можно) И так далее. Вообще говоря, во многих книгах есть главы по использованию трассировки. |
Сообщ.
#26
,
|
|
|
вот ты отредактировал свой пост, где первоначально было
![]() ![]() Text := StringReplace(Sender.asString, '###','<Formula>', [rfReplaceAll]); Text := StringReplace(Text, #13#10,' ', [rfReplaceAll]); а изменил на ![]() ![]() Text := StringReplace(Text, '###','<Formula>', [rfReplaceAll]); Text := StringReplace(Text, #13#10,' ', [rfReplaceAll]); т.е. ты заменил в своем коде в первой строке Sender.asString на Text но при втором измененном варианте все записи в поле ДБгрида становятся Пусты а при первом все просто замечательно ![]() 1) Как это можно объяснить??? ![]() 2) И т.к. у меня не простой ДБГрид, а ТНТДБГрид, то символы стали отображаться вопросительными знаками ![]() |
Сообщ.
#27
,
|
|
|
olga90 Хм. Перебдел, однако. Написал, а потом показалось, что в Text уже подан asString, при входе в процедуру, тогда второй раз его брать не надо. Можешь поставить брекпоинт и посмотреть
![]() Пишу же код по памяти, как правило, так что косяки еще и не такие могут быть. Цитата olga90 @ 2) И т.к. у меня не простой ДБГрид, а ТНТДБГрид, то символы стали отображаться вопросительными знаками . Как от этого избавиться??? А вот это уже хуже. Все символы? Вопросительные знаки - это юникод откуда-то взялся. Примерно понимаю, откуда, но тогда лучше GetText не пользоваться... Добавлено А в обычном гриде все правильно показывается? |
Сообщ.
#28
,
|
|
|
Цитата olga90 @ сначало обяви переменную 2) И т.к. у меня не простой ДБГрид, а ТНТДБГрид, то символы стали отображаться вопросительными знаками . Как от этого избавиться??? ![]() ![]() Text: WideString; и вообше, делфи не дружит с WideString-ом, так что не все методы с ним умеют работать. да ещо много чего. по этому мы придумали сделать функцию, которая переводит коды зоны 129-255 в коды уникода. обратную кажис не делали, пока не нужно. Добавлено да ещо, из за проблем с уникодом, последние два проекта сделал в делфи под нет, но тепер приняли решение что когда будет следуищи проект, делать будем на шарпе. olga90 рас ты работаеш с уникодом, советую 2006 делфи, проект вин форм под нет. некоторые баги я научилься обходить, но может они тебе и не встретятся. |
Сообщ.
#29
,
|
|
|
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. Добавлено ![]() ![]() сначало обяви переменную Text: WideString; Не поможет, нет перекрытой версии StringReplace |
Сообщ.
#30
,
|
|
|
Цитата Anatoly Podgoretsky @ значит и этои функции нет. в принципе можно и самому написать. но конечно наилущи вариант сменить среду разработки. Не поможет, нет перекрытой версии StringReplace |
Сообщ.
#31
,
|
|
|
Цитата Kobra @ значит и этои функции нет. в принципе можно и самому написать Зачем писать, то что уже написано, у нее используется пакет TNT, там есть почти все необходимое для полноценной работы с Юникод, но так как это халява, то никакой документации, все расскапывать самому по исходникам и методом проб и ошибок. Простым бросанием компонент на форму не обойтись. WideStringReplace очень простая функция и все различие в том, что вместо String используется WideString |
Сообщ.
#32
,
|
|
|
Цитата Romkin @ увидела новый метод (или слово) - прочитай в справке, что написано о его параметрах. а есть версии русского Help'a ??? Цитата Romkin @ Все символы? только символы юникода Цитата Romkin @ А в обычном гриде все правильно показывается? правильно ![]() Цитата Anatoly Podgoretsky @ ![]() ![]() TFieldGetWideTextEvent = procedure(Sender: TField; var Text: WideString; DoDisplayText: Boolean) of object; как ни пишу все равно ругается ![]() хотела сделать так ![]() ![]() ... 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. пока нет возможности перехода на них ![]() |
Сообщ.
#33
,
|
|
|
что посоветуете мне делать???
![]() |
![]() |
Сообщ.
#34
,
|
|
Цитата olga90 @ Цитата (Anatoly Podgoretsky @ Вчера, 09:01) WideStringReplace очень простая функция и все различие в том, что вместо String используется WideString если ее писать вместо StringReplace, то компилятор ругается Эта функция называется Tnt_WideStringReplace, и для ее использования достаточно подключить модуль TntSysUtils... |
Сообщ.
#35
,
|
|
|
Цитата volvo877 @ Эта функция называется Tnt_WideStringReplace, и для ее использования достаточно подключить модуль TntSysUtils... при ![]() ![]() begin if not DisplayText then exit; Text := Tnt_WideStringReplace(Sender.asString, '###','<Formula>', [rfReplaceAll]); Text := Tnt_WideStringReplace(Text, #13#10,' ', [rfReplaceAll]); end; тоже самое ![]() |
Сообщ.
#36
,
|
|
|
Цитата olga90 @ тоже самое ![]() ![]() ![]() procedure TForm.ADOTable1NameGetText(Sender: TField; var Text: String; DisplayText: Boolean); |
Сообщ.
#37
,
|
|
|
И одновременно надо обратить внимание на ее версию из TNT
procedure TForm.ADOTable1NameGetText(Sender: TField; var Text: WideString; DisplayText: Boolean); |
Сообщ.
#38
,
|
|
|
Anatoly Podgoretsky где его реализация? не нашол.
|
Сообщ.
#39
,
|
|
|
Цитата Anatoly Podgoretsky @ И одновременно надо обратить внимание на ее версию из TNT procedure TForm.ADOTable1NameGetText(Sender: TField; var Text: WideString; DisplayText: Boolean); а у меня просто String ![]() а свой не получается сделать ![]() ![]() var myText : widestring; begin myText := Text as widestring; //здесь ругается |
Сообщ.
#40
,
|
|
|
Цитата Kobra @ Anatoly Podgoretsky где его реализация? не нашол. В однои из модулей TNT в каком точно не помню, но пользоваться можно и текущим обработчиком, с приведением типа, если почему то правильный обработчик не будет построен. |
Сообщ.
#41
,
|
|
|
setStructureFactory(flagForceRefresh boolen)
|
Сообщ.
#42
,
|
|
|
olga90
у тебя вот была проблема в отображении в DBGrid'е #13#10... но замена #13#10 на пробел не вижу смысла, потому как при заполнении что так сложно самому поставить пробел, чем потом делать замену.... народ, у меня проблема в следующем: у меня при заполнении данных есть #13#10, тоесть я переношу данные на новую стоку, но вот в чём проблема, в гриде отображаютсчя квадраты, если заменять их на пробел, то получается что текс, идёт сплошным текстом, а мне нужно чтобы каждая запись начиналась с новой строки... как сделать так, чтобы каждая запись начиналась с новой строки, но в гриде было в одну строку и без квадратов? |