Форум: "Начинающим";
Текущий архив: 2013.05.12;
Скачать: [xml.tar.bz2];
ВнизКак убрать нули из DBEdit Найти похожие ветки
← →
Александр_2012 (2012-10-18 10:30) [0]Доброго дня. Есть программа, содержащая порядка 100 DBEdit, большинство которых привязаны к полям типа Integer, со значением по умолчанию 0 . Всё работает, но раздражает вывод ненужных нулей. Знаю, что можно у TField в событии OnGetText настроить любой формат вывода, но проблема в том, что не хотелось бы загружать жестко все поля БД в OraQuery и на каждое поле писать обработчик OnGetText. Можно ли написать процедуру общую для всех компонентов (работающую, например через Sender), которая обеспечила бы выполнение требуемого, к какому компоненту и событию её привязать?
← →
sniknik © (2012-10-18 10:53) [1]> и на каждое поле писать обработчик OnGetText.
напиши один на все.
← →
sniknik © (2012-10-18 10:59) [2]+
вообще пустое значение в дб компонентах "забито" под null в данных базы, 0 это уже вполне себе конкретное значение.
лучше не заменять. путаницу только внесешь.
← →
Александр_2012 (2012-10-18 11:04) [3]Увы, базу генерил не я. И логичнее было бы по умолчанию null. Хотелось бы пример, как обратиться к полю и к соответствующему событию не загружая его в соответствующий DataSet.
← →
sniknik © (2012-10-18 11:23) [4]> Хотелось бы пример, как обратиться к полю и к соответствующему событию не загружая его в соответствующий DataSet.
???
- не могу доехать до ул. ххх, 13-й автобус не ходит.
- езжай на любом до ххх идут все.
- хотелось бы пример как ездить на автобусе не садясь в него...
???
← →
sniknik © (2012-10-18 11:25) [5]> Увы, базу генерил не я. И логичнее было бы по умолчанию null.
может потому и поставили 0 дефаултом что хотели его видеть...
← →
Александр_2012 (2012-10-18 11:46) [6]Есть простейший запрос: select * from tablename where ... OraQuery возвращает набор данных, где надо указать, что нули визуализировать в DBEdit-ах не надо.
← →
sniknik © (2012-10-18 11:58) [7]если исходить из запроса то сделай его чуть сложнее, что кстати будет и более правильным, т.к. указывать * моветон (почему... а, загугли).
замени * на имена полей, где нужны замены 0 на нил тоже замени типа (не знаю оракла, т.что приблизительно) iif(field1 = 0, null, field1) as "field1".
← →
Александр_2012 (2012-10-18 12:32) [8]Идея понятна. Проблема в том, что возвращается более 100 полей, если все их перечислять в запросе, да ещё с преобразованием, то запрос получается очень громоздким.
← →
sniknik © (2012-10-18 12:40) [9]> Проблема в том, ...
не проблема... не та о которой стоит парится.
но если есть желание то всегда можно вернутся к первому предложенному варианту - sniknik © (18.10.12 10:53) [1]
← →
Александр_2012 (2012-10-18 12:47) [10]> и на каждое поле писать обработчик OnGetText.
напиши один на все.
Хотелось бы пример. Как это будет выглядеть.
← →
sniknik © (2012-10-18 12:52) [11]> Хотелось бы пример. Как это будет выглядеть.
блин... чувствую себя капитаном очевидность... пример.procedure TForm1.AllGetText(Sender: TField; var Text: String; DisplayText: Boolean);
begin
if Sender.AsString = "0"
then Text:= ""
else Sender.AsString;
end;
← →
Ega23 © (2012-10-18 14:20) [12]Поправочка:
procedure TForm1.AllGetText(Sender: TField; var Text: String; DisplayText: Boolean);
begin
if Sender.AsString = "0"
then Text:= ""
else Text:= Sender.AsString;
end;
← →
Александр_2012 (2012-10-18 16:39) [13]Капитану-очевидность
Прошу объяснить как применить этот замечательный код (к чему привязать, откуда на него сослаться)
Юнга-неочевидность
← →
Jeer © (2012-10-18 17:09) [14]
> Александр_2012 (18.10.12 16:39) [13]
1. Вам или рано или вообще не следует заниматься программированием.
Не, ну бывает так - мозги сложены под "лицезрение", а не аналитику.
2. Вам сказано и сделано все, чтобы Вы поняли и применили.
Если не хватает, значит не хватает.
Еще раз и внимательнее обратите внимание на [1] и [11,12].
← →
Ega23 © (2012-10-18 17:15) [15]
> Прошу объяснить как применить этот замечательный код (к
> чему привязать, откуда на него сослаться)
unit Unit50;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm50 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure FormCreate(Sender: TObject);
private
procedure ButtonOnClick(Sender: TObject);
public
end;
var
Form50: TForm50;
implementation
{$R *.dfm}
//*****************************************************************************
{ TForm50 }
procedure TForm50.ButtonOnClick(Sender: TObject);
begin
ShowMessage(TButton(Sender).Caption);
end;
procedure TForm50.FormCreate(Sender: TObject);
var
i: Integer;
begin
for i := 0 to ComponentCount - 1 do
if Components[i] is TButton then
TButton(Components[i]).OnClick := ButtonOnClick;
end;
end.
Кнопок, как ты понимаешь, можно накидать хоть 100500, для всех OnClick будет одинаков.
← →
Inovet © (2012-10-18 17:40) [16]> [15] Ega23 © (18.10.12 17:15)
> Кнопок, как ты понимаешь, можно накидать хоть 100500, для
> всех OnClick будет одинаков.
Щас он начнот циклы копипастить. Наверное стрелочку рядом с выбором обработчика события не видит.
← →
Jeer © (2012-10-18 18:27) [17]
> Ega23 © (18.10.12 17:15) [15]
Шо ж ты творишь ?
Сейчас это чудо начнет всовывать твой код в Delphi и искать где ж там Field-ы и почему у них кнопок нет.
← →
Ega23 © (2012-10-18 20:13) [18]
>
> Шо ж ты творишь ?
А у меня нет TDBEdit. Точнее, есть, но мне было в лом искать :)
Да и ваще, пусть думает. Кто хочет разобраться, тому данного примера будет достаточно. Кто не хочет - я не виноват. :)
← →
Jeer © (2012-10-19 16:20) [19]
> Кто не хочет - я не виноват. :)
Ну да - "Кито хотел секса и не подстраховался, тот мимо <дамок>" (C)
← →
MsGuns © (2012-10-22 11:23) [20]>Александр_2012
Советую Вам почитать хоть одну хорошую (не Архангельского) книжку по ОПП.
← →
Александр_2012 (2012-10-22 11:44) [21]Спасибо, уважаемые господа. Если вы обратили внимание, то я обратился на форум для начинающих. У меня очень большие сомнения, что все начинающие прекрасно разбираются что такое Sender, и как найти те или иные свойства полей БД, если их предварительно не загрузить в редактор полей.
← →
Ega23 © (2012-10-22 12:02) [22]
> У меня очень большие сомнения, что все начинающие прекрасно
> разбираются что такое Sender
http://slovari.yandex.ru/sender/en-ru/#lingvo/
← →
MsGuns © (2012-10-22 12:45) [23]А Вам как начинающему и советуют. Поймите, сложно объяснить новичку защиту Каро-Кан если он, новичок, не знает как ходят шахматные фигуры.
← →
Александр_2012 (2012-10-22 14:15) [24]Хорошо, попытался воспользоваться Вашими советами.
1. Создал процедуру
procedure TDM.AllGetText(Sender: TField; var Text: String;
DisplayText: Boolean);
begin
if DisplayText then
begin
if Sender.AsString="0" then
Text:=""
else
begin
Text:=Sender.AsString;
end;
end;
end;
Решил, что можно к ней обратиться после открытия набора данных
procedure TDM.DataQAfterOpen(DataSet: TDataSet);
var
i: integer;
begin
for i:=0 to DataQ.FieldCount-1 do
DataQ.Fields[i].OnGetText:=AllGetText;
end;
Компилирую... Ура нет нулей, но достаточно встать на какое-нибудь поле или на DBNavigator нажать Next, как тут же получаю:
Could not convert variant of type (String) into type (Double)
Если я правильно понял,то ошибку вызывает строка
Text:=Sender.AsString;
по крайней мере, если её закоментировать, то ошибка исчезает, правда все поля получаю пустыми.
Как это обойти?
← →
Медвежонок Пятачок © (2012-10-22 14:20) [25]В приведенной строке нет конвертации к дабл.
← →
MsGuns © (2012-10-22 14:57) [26]if not Sender.IsNull then
<Ваш код>
Ну и Format() вместо AsString
И опять же надо бы проверять тип полей и делать конвертацию только для чисел
И последнее: для "тонкого" отображения полей (даты, дроби..) в нужном формате используется свойство TxxxField.DisplayFormat
← →
Медвежонок Пятачок © (2012-10-22 15:41) [27]а все равно не поможет.
← →
Inovet © (2012-10-22 17:36) [28]> [24] Александр_2012 (22.10.12 14:15)
> for i:=0 to DataQ.FieldCount-1 do
> DataQ.Fields[i].OnGetText:=AllGetText;
Все поля одного типа?
← →
Александр_2012 (2012-10-22 20:17) [29]Большинство полей integer, есть string и datetime
← →
sniknik © (2012-10-22 21:51) [30]нужен AllSetText с обратной операцией
← →
sniknik © (2012-10-22 22:40) [31]> Большинство полей integer, есть string и datetime
а убирать нужно для каких? может нужна процедура AllIntegerGetText ? а не все подряд.
← →
Александр_2012 (2012-10-23 15:08) [32]
> а убирать нужно для каких? может нужна процедура AllIntegerGetText
> ? а не все подряд.
Конечно для integer. Пытался делать проверку на тип поля, но не получилось, наверное делал неправильно.
← →
Ega23 © (2012-10-23 16:56) [33]
> Пытался делать проверку на тип поля, но не получилось, наверное
> делал неправильно.if Fields[i].FieldType = ftInteger then
← →
Eeuwige Rouw (2012-10-24 04:16) [34]
> Советую Вам почитать хоть одну хорошую (не Архангельского)
> книжку по ОПП.
Что плохого в Архангельском?
Кстати, я один раз пользовал его функцию (к его книге шел диск с примерами),
функция у меня не стабильно работала, выложил ее тут на ваше обсуждение,
и ее назвали говнокодом...
Вот и пойми, кто пишет правильно а кто нет...
Краснов (ОпенГл)... вот это было задушевное чтение...
← →
Ega23 © (2012-10-24 07:38) [35]
> Что плохого в Архангельском?
> Кстати, я один раз пользовал его функцию (к его книге шел диск с примерами),
> функция у меня не стабильно работала, выложил ее тут на ваше обсуждение,
> и ее назвали говнокодом...
Теперь понимаешь, что плохого в Архангельском?
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2013.05.12;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.002 c