Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.57/47: Рейтинг темы: голосов - 47, средняя оценка - 4.57
14 / 14 / 1
Регистрация: 21.10.2010
Сообщений: 462
1

Как изменить размер существующего поля таблицы ACCESS?

02.02.2013, 19:50. Показов 8726. Ответов 75
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Delphi
1
2
3
4
5
6
7
  With ADOQuery2 do
  begin
    Close;
    SQL.Clear;
    SQL.Text :='ALTER TABLE properconnections ALTER COLUMN D15 TEXT (30)';
    ExecSQL;
  end;
Ошибка "Access violation".
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.02.2013, 19:50
Ответы с готовыми решениями:

Как изменить размер TImage под текущий размер Picture ?
Доброго времени суток! Есть задача (Delphi 7). В TImage загружается Picture с условиями: Center...

Экспорт из Access в FoxPro. Как изменить формат поля таблицы?
Сохраняю таблицу из MS Access 97 во внешнем файле формата Microsoft FoxPro 2.0 (dbf). При этом...

Изменить размер поля таблицы присоединенной БД
Добрый день, нужно изменить структуру разделенной БД из клиентской, запрос CurrentDb.Execute...

Как изменить размер поля ввода?
нужно чтобы они были уже

75
14 / 14 / 1
Регистрация: 21.10.2010
Сообщений: 462
03.02.2013, 21:03  [ТС] 41
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от gorfil Посмотреть сообщение
Специально перепроверил - все сохраняется.
Ну тогда не знаю! По-разному, что-ли в разных дельфях?! У меня после селекта все колонки принимают ширину соответствующего поля.
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
03.02.2013, 21:05 42
Цитата Сообщение от Злобный Зайц Посмотреть сообщение
Хотя до этого было задано DBGrid2.Columns[i].Width
А надо было задавать DBGrid2.Columns[i].Field.DisplayWidth.
0
14 / 14 / 1
Регистрация: 21.10.2010
Сообщений: 462
03.02.2013, 21:23  [ТС] 43
Цитата Сообщение от mss Посмотреть сообщение
А надо было задавать DBGrid2.Columns[i].Field.DisplayWidth.
ЫЫЫЫЫЫЫЫЫЫ!!!!!
Сделал так. Те же гениталии, только впрофиль!!! Застрелюсь!!!!
0
Модератор
3490 / 2613 / 741
Регистрация: 19.09.2012
Сообщений: 7,974
03.02.2013, 21:28 44
Можешь проект выложить - посмотрим.
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
03.02.2013, 21:37 45
1. Не создавай колонки грида явно в дизайн-тайм.
2. Создай явно в дизайн-тайм все необходимые объекты-поля в редакторе полей объекта, который будет использован для SELECT-запроса, у каждого из созданных объектов-полей установи нужные значения св-в FieldName, DisplayLabel и DisplayWidth

Добавлено через 1 минуту
3. Включи наконец мозг и пойми что в учебнике все это описано гораздо подробнее и понятнее-нагляднее.
0
14 / 14 / 1
Регистрация: 21.10.2010
Сообщений: 462
03.02.2013, 21:43  [ТС] 46
Цитата Сообщение от gorfil Посмотреть сообщение
Можешь проект выложить - посмотрим.
С удовольствием выкладываю. Только тут надо будет понажимать не педали. Надо ткнуть в пункт меню "mdb", загрузить, к примеру, "687263001.mdb". Далее - даблкликать по элементам поля "Components" - выскочит ещё один ДБгрид, в котором будут добавляться колонки по каждому даблклику. Далее надо будет заполнять таблицу. Но до этого дело не доходит. Когда добавляется колонка, она имеет вполне кошерную ширину. Как только добавляю следующую, предыдущая принимает ширину 100, точнёхонько по ширине соответствующего поля ADOQuery2. Просиходит это в результате селекта.
Вложения
Тип файла: rar DBNetlist.rar (1.94 Мб, 4 просмотров)
0
Модератор
3490 / 2613 / 741
Регистрация: 19.09.2012
Сообщений: 7,974
03.02.2013, 22:04 47
Подправь:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
procedure TForm1.SQLRequest2(Request:string);
var
  i: integer;
begin
  With ADOQuery2 do
  begin
    Close;
    SQL.Clear;
    SQL.Text :=Request;
    Open;
    for i := 0 to FieldCount - 1 do
      Fields[i].DisplayWidth := 10;
  end;
end;
 
// .........
 
end;procedure TForm1.DBGrid1DblClick(Sender: TObject);
var FieldName:string;
begin
  if UpperCase(DBGrid1.SelectedField.FieldName)='COMPONENTS'then
  begin
    FieldName:=DBGrid1.SelectedField.Text;
    ADDColumn(FieldName);
    SQLRequest2('select * from ProperConnections');
    DBGrid2.Visible:=True; // !!!
  end;  
end;
0
14 / 14 / 1
Регистрация: 21.10.2010
Сообщений: 462
03.02.2013, 22:12  [ТС] 48
То есть, сделать все поля по 10?! Это не то! Это я могу прекрасно сделать и при создании поля. Создавать шириной не 100, а 10, только и всего. Или я что-то недопонял?
0
Модератор
3490 / 2613 / 741
Регистрация: 19.09.2012
Сообщений: 7,974
03.02.2013, 22:19 49
Это просто пример того, как установить нужный размер поля не трогая базу.
В этом месте можно, например, добавить поиск максимального значения элемента поля и выставить ширину по нему.
0
14 / 14 / 1
Регистрация: 21.10.2010
Сообщений: 462
03.02.2013, 22:22  [ТС] 50
Цитата Сообщение от mss Посмотреть сообщение
3. Включи наконец мозг и пойми что в учебнике все это описано гораздо подробнее и понятнее-нагляднее.
Уговорил. Назови хороший букварь. Желательно на русском и не бумажный.
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
03.02.2013, 22:30 51
К примеру,

Шумаков П.В, В.Фаронов "Руководство разработчика баз данных Delphi 5"
В.Фаронов "Программирование баз данных в Delphi 7 (учебный курс)"
0
14 / 14 / 1
Регистрация: 21.10.2010
Сообщений: 462
03.02.2013, 22:33  [ТС] 52
Цитата Сообщение от gorfil Посмотреть сообщение
Это просто пример того, как установить нужный размер поля не трогая базу.
В этом месте можно, например, добавить поиск максимального значения элемента поля и выставить ширину по нему.
Про это я писал. Нет проблемы - написать свою процедуру подгонки ширины колонок. Вариантов тьма. Можно колонки грида менять, можно поля таблицы. Потом тупо и нудно вызывать эту процедуру каждый раз после каждого запроса. Если нет другого выхода, придётся сделать так. Но, повторюсь - это, на мой взгляд, дурно пахнет. Это именно "тупо и нудно"! Если только так можно заставить эти гриды и эти адоквери давать требуемый результат, то какое же всё это ДЕРЬМО! (Пардон, вырвалось. Будем считать, что я этого не говорил.)
0
Модератор
3490 / 2613 / 741
Регистрация: 19.09.2012
Сообщений: 7,974
03.02.2013, 22:44 53
Ну если реализуешь это как-то умнО и весело, то дай знать.
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
03.02.2013, 22:47 54
Ты пойми одну простую вешь - пользователь вправе и должен сам устанавливать атрибуты визуализации колонок грида (ширина, порядок следования и т.д.)

Твое дело - не навязывать ему свои представления о том как это должно выглядеть, а предоставить ему минимально необходимый и удобный инструментарий для того чтобы он мог установить при запуске (и автоматически восстановить при перезапуске) свои предпочтения.
0
14 / 14 / 1
Регистрация: 21.10.2010
Сообщений: 462
03.02.2013, 22:59  [ТС] 55
Слишком учёно для моих мозгов. Ты лучше скажи - возможно установить ширину колонок по ширине данных так, чтобы после каждого запроса не выставлять заново? Ведь мне там надо бы и сортировку сделать, и кое-что ещё. И всё это надо через запросы. Или оставить надежду, и восстанавливать каждый раз? Плевать, что коряво внутри, лишь бы работало снаружи? Как-то так?
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
03.02.2013, 23:10 56
Пример (не для подражания - не обезъянничать тупо !) как можно сохранять и восстанавливать ширину и порядок следования колонок в DBGrid и ValueListEditor (оба наследники TCustomGrid):

Код
// сохранение в контексте события TDataSet.BeforeClose
procedure SaveGridColumnsLayout(Grid: TCustomGrid; IniFile: TIniFile);
var
  Owner: TComponent;
  i: Integer;
  slw, slo: TStringList;
  s: AnsiString;
  NeedOpenFile: Boolean;
begin
  s := Grid.Name;
  Owner := Grid.Owner;
  while Assigned(Owner) and not (Owner is TForm) do
    Owner := Owner.Owner;
  if Assigned(Owner) then
    s := Format('%s.%s', [Owner.Name, s]);

  NeedOpenFile := not Assigned(IniFile);
  if NeedOpenFile then
    IniFile := TIniFile.Create(frmSetup.IniFileName);
  slw := TStringList.Create;
  slo := TStringList.Create;
  try
    slw.Delimiter := ',';
    slo.Delimiter := ',';
    if Grid is TDBGrid then
      for i := 0 to TDBGrid(Grid).Columns.Count - 1 do
        begin
          slo.Add(TDBGrid(Grid).Columns[i].FieldName);
          slw.Add(IntToStr(TDBGrid(Grid).Columns[i].Width));
        end
    else if Grid is TValueListEditor then
      for i := 0 to TValueListEditor(Grid).TitleCaptions.Count - 1 do
        begin
          slo.Add(TValueListEditor(Grid).TitleCaptions[i]);
          slw.Add(IntToStr(TValueListEditor(Grid).ColWidths[i]));
        end
    else
      Exit;
    IniFile.WriteString('ControlsAdjustment', Format('%s.ColumnsOrder', [s]), slo.DelimitedText);
    IniFile.WriteString('ControlsAdjustment', Format('%s.ColumnsWidth', [s]), slw.DelimitedText);
  finally
    slw.Free;
    slo.Free;
    if NeedOpenFile then
      IniFile.Free;
  end;
end;

// восстановление в контексте события TDataSet.AfterOpen
procedure RestoreGridColumnsLayout(Grid: TCustomGrid; IniFile: TIniFile);
var
  Owner: TComponent;
  i,k,w: Integer;
  slw, slo: TStringList;
  s: AnsiString;
  NeedOpenFile: Boolean;
begin
  s := Grid.Name;
  Owner := Grid.Owner;
  while Assigned(Owner) and not (Owner is TForm) do
    Owner := Owner.Owner;
  if Assigned(Owner) then
    s := Format('%s.%s', [Owner.Name, s]);
  NeedOpenFile := not Assigned(IniFile);
  if NeedOpenFile then
    IniFile := TIniFile.Create(frmSetup.IniFileName);
  slw := TStringList.Create;
  slo := TStringList.Create;
  try
    slw.Delimiter := ',';
    slo.Delimiter := ',';
    slo.DelimitedText := IniFile.ReadString('ControlsAdjustment', Format('%s.ColumnsOrder', [s]), '');
    slw.DelimitedText := IniFile.ReadString('ControlsAdjustment', Format('%s.ColumnsWidth', [s]), '');
    if Grid is TDBGrid then
      begin
        for k := 0 to slo.Count - 1 do
          for i := 0 to TDBGrid(Grid).Columns.Count - 1 do
            if AnsiCompareText(TDBGrid(Grid).Columns[i].FieldName, slo[k]) = 0 then
              begin
                try
                  TDBGrid(Grid).Columns[i].Index := k;
                except
                end;
                Break;
              end;
        for k := 0 to slw.Count - 1 do
          if TryStrToInt(slw[k], w) then
            try
              TDBGrid(Grid).Columns[k].Width := w;
            except
            end;
      end
    else if Grid is TValueListEditor then
      begin
        for k := 0 to slw.Count - 1 do
          if TryStrToInt(slw[k], w) then
            try
              TValueListEditor(Grid).ColWidths[k] := w;
            except
            end;
      end
    else
      Exit;
  finally
    slw.Free;
    slo.Free;
    if NeedOpenFile then
      IniFile.Free;
  end;
end;
Добавлено через 9 минут
Фрагмент создаваемого при сохранении файла настроек:

[ControlsAdjustment]
frmMain.gridJournal.ColumnsOrder=Date,Time,Channel,RegNumber,Access
frmMain.gridJournal.ColumnsWidth=125,92,70,114,35
0
14 / 14 / 1
Регистрация: 21.10.2010
Сообщений: 462
03.02.2013, 23:19  [ТС] 57
Ну вот. Что и требовалось доказать. Без кучи вложенных сложносочинённых циклов не обойтись. Это типа как купить машину. Тачка-то классная, но едет только боком. Чтобы ехала прямо, надо кней плуг от трактора приделать резинкой от трусов. Вонзить ентот плух в асфальт и он не даст ей повернуться боком, только мордой вперёд. Ну да, ну чуток дизайн подпортит. Ну скорость маленько упадёт. Зато же ехать можно будет. Вот это АДО, на мой взгляд, и есть такая замечательная тачка. Аминь.
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
03.02.2013, 23:25 58
Цитата Сообщение от Злобный Зайц Посмотреть сообщение
возможно установить ширину колонок по ширине данных так, чтобы после каждого запроса не выставлять заново?
Сведения о ширине актуальных данных в некоем поле набора данных, возврааемого в результате SELECT-запроса, становятся доступными не ранее возникновения события AfterOpen.

До этого момента никаких предположений о ширине соответствующей полю будущей колонки грида сделать попросту невозможно.

Добавлено через 6 минут
Цитата Сообщение от Злобный Зайц Посмотреть сообщение
Вот это АДО, на мой взгляд и есть такая замечательная тачка
Причем здесь ADO ?
Такую инф-цию тебе не выдаст "по мановению волшебной палки" ни один иной программно-технологический СУБД-механизм общего назначения.
0
14 / 14 / 1
Регистрация: 21.10.2010
Сообщений: 462
03.02.2013, 23:31  [ТС] 59
Ну ладно. Значит, если я правильно понял, вердикт такой: восстанавливать столбы после каждого запроса и никак не иначе?
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
04.02.2013, 09:09 60
Верно.
0
04.02.2013, 09:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.02.2013, 09:09
Помогаю со студенческими работами здесь

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

Размер ячеек таблицы - как изменить ?
Доброго времени! Такая проблемка: есть таблица со свойством table-layout: fixed; это свойство...

Как в А2000 поле размер числового поля таблицы сделать....
Вопрос уже задавал, но возможно не внятно сформулировал. Как в А2000 длину числового поля...

Как изменить размер изображения, вставленного в ячейку таблицы MS Word?
Формирую таблицу с картинками в MS Word из 1С по технологии COM. Столкнулся с тем, что картинка...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru