Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Клуб профессиональных программистов :: Выпуск #90


Клуб профессиональных программистов "Весельчак У"
Информационная рассылка сайта и форума.  Выпуск No90 (2010-04-16).

Здравствуйте, уважаемые читатели!

Небольшое дополнение к ранее вышедшей статье «MySQL. Иерархические запросы». Здесь предлагаю решение той же самой задачи — выборки поддерева на связях id — parent_id, но без динамического SQL — на временных таблицах. Такой вариант работает много быстрее, но процедуры оказываются жестко привязанными к таблицам.

Для начала напомню особенности временных таблиц. Имя временной таблицы не должно совпадать с именем уже существующей таблицы, но в разных сессиях могут быть временные таблицы с одинаковыми именами. Также удобно то, что они автоматически удаляются при завершении сессии и не замусоривают базу. Временные таблицы могут быть форматов MEMORY (что полезно для скорости работы) и MYISAM.


Для начала создаем тестовую таблицу:


Код: (sql)
CREATE TABLE t1 (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    parent_id INT UNSIGNED NOT NULL,
    lvl SMALLINT UNSIGNED NOT NULL,
    PRIMARY KEY (id),
    UNIQUE KEY parent (parent_id, id),
    UNIQUE KEY lvl (lvl, id)
) ENGINE = MYISAM;

Этой процедурой заполним таблицу тестовыми данными:


...


Целиком статью вы можете прочесть на нашем сайте в разделе «Базы данных::MySQL».

С примерами и картинками. :)



Часто при обработке текста на русском языке начинающие PHP-программисты удивляются, почему после обрезания строки она вместо последней буквы может заканчиваться непонятным символом. Часто причиной этого «эффекта» является многобайтная кодировка.


Давайте разберемся, что это такое.

Многобайтной кодировкой символов называют кодировку, в которой один символ представлен несколькими байтами. Типичным примером многобайтной кодировки является UTF-8. UTF-8 набирает все большую популярность в Web-программировании, поэтому рассмотрим именно ее.

Вот что говорит Википедия по поводу многобайтности UTF-8:


Цитата: Википедия
Символы, закодированные в UTF-8, могут быть длиной до шести байт, однако стандарт Unicode не определяет символов выше 0x10ffff, поэтому символы Unicode могут иметь максимальный размер в 4 байта в UTF-8.

Для нас сейчас важно, что один символ в кодировке UTF-8 может определяться несколькими байтами, а не одним байтом.

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

Справка из Википедии:


Цитата: Википедия
ASCII представляет собой 7-битную кодировку для представления десятичных цифр, латинского и национального алфавитов, знаков препинания и управляющих символов. В компьютерах обычно используют 8-битные расширения ASCII.

Т.е. в кодировке ASCII один символ представлен одним байтом.


Теперь перейдем к практическому примеру.

...


Целиком статью вы можете прочесть на нашем сайте в разделе «Web::PHP».

С примерами и картинками. :)



  • Программирование :: Общий
  • Для скрипта проверки формы "на лету" написал скрипт, но есть проблема: если в поле написано латиницей, то всё хорошо, если же кириллицей, то в любом случае скрипт говорит, что ник свободен.
    Мой запрос выглядит так:
    Код:
    $this->mMysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_DATABASE);
    $query = $this->mMysqli->query('SELECT nik FROM users WHERE nik="'.$value.'"');
    if ($this->mMysqli->affected_rows > 0)
    {
    $answer = 'Этот ник уже занят.';
    return $answer;
    }
    В интернете видел пример, там после подключения сразу написали:
    Код:
    $mMysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD,DB_DATABASE);
    [b]$mMysqli->query("SET CHARACTER SET cp1251");[/b]
    Но мне эта строчка не очень то помогла. Как быть?
  • Программирование :: Технологии разработки программных систем
  • Есть пожизненная проблема. Мои классы всегда почему-то хотят знать друг о друге, и меня это расстраивает. Не могу понять, как надо начать мыслить, чтобы такого не получалось.
    Далее я немного углублюсь в подробности (можете пропустить), сам вопрос после этой секции.
    ==============
    Например, сейчас пишу StatefulControl для asp.net. Смысл контрола в том, чтобы упростить создание визуальных контролов, которые переходят из состояния в состояние. К примеру, поисковик людей имеет три состояния - состояние поиска (текстбокс, кнопка "найти"), состояние результатов поиска (таблица с найденными людьми с возможностью выбора одного из них) и состояние, когда сотрудник выбран (span с именем выбранного сотрудника и кнопка "изменить", возвращающая контрол в первое состояние).
    Кто писал контролы, переходящие из состояния в состояние на asp.net, тот знает, что там есть кое-какая закавыка с тем, что чтобы сменить состояние, надо сначала восстановить предыдущее состояние полностью, потом словить событие (кнопки, например), очистить текущий набор созданных контролов и создать новый набор, основываясь на новом состоянии.
    Когда это пишешь где-то так третий раз, становится уже не смешно и хочется вынести общую часть раз и навсегда.
    ==============
    Сначала начал создавать диаграммку, потом нервы сдали, и стал писать сразу кодом, поскольку фантазии не хватает, представить какие проблемы будут в коде - как-то проще представить диаграмму по коду.
    Первым классом идёт StatefulControl
    Код:
        public abstract class StatefulControl : CompositeControl {
            private StateManager _state_mode_manager;

            public StatefulControl() {
                _state_mode_manager = new StateManager(CreateProvider());
            }
            protected override void OnInit(EventArgs e) {
                base.OnInit(e);
                this.Page.RegisterRequiresControlState(this);
            }
            protected override void OnLoad(EventArgs e) {
                base.OnLoad(e);
            }
            protected override void CreateChildControls() {
                _state_mode_manager.RestoreStateByName(_state.SavedStateModeName);
                this.Controls.Add(_state_mode_manager.GetRootControl());
            }
            public override void RenderControl(System.Web.UI.HtmlTextWriter writer) {
                _state_mode_manager.RenderControls(writer);
            }

            private StatefulControlState _state;
            protected override void LoadControlState(object savedState) {
                _state = (StatefulControlState)savedState;
            }
            protected override object SaveControlState() {
                _state.SavedStateModeName = _state_mode_manager.CurrentStateMode.StateModeName;
                return _state;
            }
            protected abstract IStateModesProvider CreateProvider();
        }
    Фактически целью этого класса является упростить конечный класс (чтобы в него это не пихать). В общем-то просто даёт команды StateManager'у в нужный момент.

    Собственно сам StateManager:
    Код:
        class StateManager {
            IStateModesProvider _provider;
            public StateManager(IStateModesProvider provider) {
                _provider = provider;
                _root_control = new Control();
            }
            public void RestoreStateByName(string name) {
                _current_state_mode = _provider.GetStateModeByName(name);
                _current_state_mode.CreateControlsOnRestoring();
                _root_control.Controls.Clear();
                _root_control.Controls.Add(_current_state_mode);
            }
            public void SwitchToState(BaseStateModeControl state) {
                _current_state_mode = state;
                _current_state_mode.CreateControlsOnStateChanging();
                _root_control.Controls.Clear();
                _root_control.Controls.Add(_current_state_mode);
            }
            private Control _root_control;
            public Control GetRootControl() {
                return _root_control;
            }
            public void RenderControls(HtmlTextWriter writer) {
                _root_control.RenderControl(writer);
            }

            private BaseStateModeControl _current_state_mode;
            public BaseStateModeControl CurrentStateMode {
                get {
                    return _current_state_mode;
                }
            }
        }
    Он у меня переводит управляет состояниями - т.е. принимает команду на смену состояния и меняет его должным образом.
    Ещё он у меня стал хранителем корневого контрола - это произошло случайно, когда я развязывал связь между StateManager'ом и StatefuControl'ом. Раньше я сообщал StatefulControl StateManager'у (в классе-обёртке), чтобы он потом передал его конечным состояниям, чтобы они в него пихали свои контролы (текстбоксы, кнопки). Т.е. StateManager и StatefulControl фактически знали друг о друге. Чтобы сделать связь односторонней я добавил StateManager'у метод GetRootControl и теперь у него StatefulControl сам спрашивает корневой элемент.
    Честно говоря до реального теста ещё не дошёл, подозреваю, что может не сработать, поэтому и лишнюю ответственность из StateManager'а убирать не спешу - возможно придётся переделывать.

    Конечные состояния (с кнопками и текстбоксами) будут создаваться провайдером состояний IStateModesProvider, который будет создан фабричным методом в StatefulControl'е и передан StateManager'у в конструкторе.

    А вот дальше у меня возник вопрос.
    Дело в том, что я хочу, чтобы мои конечные состояния сами управляли переходом в другие состояния (это удобно в конечном итоге при использовании всей этой структуры - использовать события кнопок, гридов, чтобы менять состояние, прямо внутри этих событий). И здесь неизбежны (на мой взгляд) два варианты:
    - они должны посылать эту команду напрямую StateManager'у. Тогда StateManager должен сообщить себя провайдеру состояний, а он в свою очередь сообщит его конечным состояниям.
    - они будут посылать команду провайдеру, а он будет пересылать её StateManager'у.
    И в том и в другом случае налицо появление встречных зависимостей. На данный момент вроде как очевидно, что StateManager должен знать о провайдере и состояниях (их интерфейсах), а теперь ещё появляется встречная связь - провайдер и/или состояния тоже знают про менеджера.
    И всё бы ничего, но я уже пару раз обжёгся на таких связях, поскольку появляется необходимость при кодинге одного класса помнить, какой этап жизни переживает другой класс. Т.е. например, я начну в конструкторе StateManager'а сообщать Provider'у самого себя:
    Код:
            public StateManager(IStateModesProvider provider) {
                _provider = provider;
                _provider.Manager = this;
                _root_control = new Control();
            }
    а конкретный провайдер у меня был уже создан в фабричном методе, поэтому в конструкторе провайдера я не смогу передать менеджера конечным состояниям (поскольку мне его ещё не выставили).
    Получается, что я должен буду добавить метод для инициализации конечных состояний:
    Код:
            public StateManager(IStateModesProvider provider) {
                _provider = provider;
                _provider.Manager = this;
                _provider.InitManagerToStates();
                _root_control = new Control();
            }
    или просто
    Код:
            public StateManager(IStateModesProvider provider) {
                _provider = provider;
                _provider.Manager = this;
                _provider.InitStates();
                _root_control = new Control();
            }
    но уже создавать конечные состояния я буду только в методе InitStates() и буду рассчитывать, что в этом методе менеджер у меня уже будет.
    А потом в ходе метода InitStates выяснится, что я не могу по полной использовать Manager'а, поскольку его _root_control ещё не был проинициализирован. Конечно, я могу пойти и переставить их местами, но это уже танцы с бубнами - такое рано или поздно подводит (или забываешь, или перестановки начинают конфликтовать).

    и вот это меня и смущает - получается в любой момент времени, я должен помнить о том, как себя чувствует одно из свойств - проинициализировано оно или нет.
    Подозреваю, что проблема именно во встречных зависимостях. Если бы зависимости были строго древовидными, то процесс инициализации был бы строго определён и был бы не настолько важен, либо очевиден.
    Кроме того, я вижу у себя нарушение заповеди "делать в конструкторе как можно меньше" - я про такое слышал и нутром чувствую, что в конструкторе надо только назначать присланные "свыше" переменные своим полям. И уж точно никаких операторов new (как у меня в конструкторе StatefulControl'а, например) быть и подавно не должно. Но не могу от них избавиться - если тащу всё наверх, то становится слишком много зависимостей между классами (через конструкторы) и всё превращается в кашу (по крайней мере на диаграмме).

    Помогите, а? Советом каким-нибудь, или может таблетки какие попить?
    Как избегать таких проблем? И как решить конкретно эту?

    Спасибо!

    p.s. поскольку текста много, ещё раз просуммирую вышесказанное.
    StatefulControl, занимается спецификой asp.net, знает о StateManager'е.
    StateManger, занимается переводом целевого контрола из одного состояния в другое, знает о StateProvider'е, чтобы работать через него с конечными состояниями.
    StateProvider, инициализирует и хранит в себе конечные состояния.
    Классы конечных состояний - классы, которые будут содержать в себе визуальные компоненты (текстбоксы, кнопки, гриды) и заниматься непосредственно тем, чем надо для данного контрола.
  • Заметил, что тема http://forum.shelek.ru/index.php/topic,15142.0.html всё ещё поддерживается, однако разговор там уже немного на другую тему, поэтому хотел бы вынести обсуждение понимания РУПа в отдельную ветку.
    Дело в том, что читая дискуссию, которую вели Dimka и lapulya (надеюсь, вы это тоже читаете, поэтому не сочтите за разговор в третьем лице), я заметил, что мне как-то ближе то, что писал lapulya. Но во-первых, я себя опытным бизнес-аналитиком не чувствую (и поэтому постоянно сомневаюсь), а во-вторых, часто один скажет одно, а второй с ним согласится имея совершено другую точку зрения. На мой взгляд лучше, когда второй в ответ первому выразит своё понимание и первый согласится с данной формулировкой.
    Т.е. сейчас я хочу быть вторым, который вроде бы как уловил суть того, что сказал первый (lapulya), и сейчас хотел бы выразить своё понимание данного вопроса.

    Обучался я РУПу у Золотухиной Елены (отчества, к сожалению не помню). Курсы длились неделю, первые три дня у меня пухла голова от желания и неспособности уловить суть, а на четвёртый я всё же что-то понял. Признаю, что мог понять неправильно, а также то, что у преподавателя могло быть своё понимание, которое тоже может быть искажено.
    Но, честно говоря, мне уже даже не важно, насколько то, что я понял является РУПом. Моя проблема в том, что сейчас на работе мы (наконец-то) формализуем процесс разработки и поэтому важно называть всё своими именами. И есть кое-какие несостыковки, но об этом позже.

    Итак, как вести разработку по РУПу (версия моя, искажённая призмой моего мозга):
    1. В основе всего лежат бизнес-процессы. Их обозначить в первую очередь и требуется. Причём важно, что собираем мы информацию обо всех бизнес-процессах (тем глубже и тем тщательней, чем, на наш взгляд, это может затронуть автоматизируемый бизнес-процесс). Если говорим, что мы документируем используя UML, то на этом этапе рисуются BusinessCases (которые графически выглядят фактически также как UseCases, только с чёрточкой сбоку).
    2. BusinessCase'ы детализируются в ProcessFlow, которые дают понять какие именно этапы понимаются под данным BusinessCase. Это важно, поскольку часто по названию сложно понять, что же за этим понимается, а кроме того пользователь глядя на такой Flow может спросить "а где мы делаем вот это (какое-то действие)?" и тогда мы скажем "ах вы ещё и это делаете?" и подкорректируем своё понимание бизнеса.
    3. Каждый шаг в ProcessFlow довольно в общем виде характеризует этап/действие. И поэтому их тоже надо детализировать. Следующий этап я не помню даже близко как называется, поэтому я называю его термином UML - ActivityDiagram, что, каюсь, неправильно. На этом уровне мы детально прописываем шаги и, что важно, у каждого шага указываем входные и выходные объекты. Если шаг не имеет входного или выходного объекты, значит мы что-то не понимаем.
    4. Далее мы проходим по всем диаграммкам и помечаем какие из этапов (на ActivityDiagram'ах) мы будем автоматизировать. Фактически немного перефразируя названия этапов, мы получаем список системных требований.
    5. Далее, имея на руках объекты, полученные в шаге №3, мы можем осмелиться начать рисовать диаграмму объектов или даже БД. В принципе, по-моему скромному опыту, на этом этапе уже редко ошибаешься.
    6. Имея какое-то понимание бизнес-процессов, мы (фактически от балды) выдумываем нефукнциональные требования, применимые в данном случае. Может быть по странному стечению обстоятельств, но на данном этапе тоже вроде пока не ошибался с набором требований, хотя он и выдуманный.
    7. Имея диаграмму объектов из пятого шага и требования из четвёртого и шестого, мы начинаем проектировать код (в голове ли или на диаграммах).
    8. Когда чувствуем готовность пишем код. Код можем покрыть как юнит-тестами, так и функциональными тестами, исходя из списка требований. Пишем "снизу вверх", сначала реализуем нефункциональные требования. Функциональные требования и их принадлежность с определённым бизнес-процессам, позволяет разбить написание продукта на итерации.

    И вот сейчас написал всё это и понял, что не РУП это вовсе. )))
    Но удалять не буду - поскольку хотелось бы увидеть чьё-то чужое пошаговое понимание процесса разработки по РУПу.

    Меня в моём понимании РУПа смущает ряд фактов. Пара из них:
    - слабая итеративность. Т.е. итеративность начинается только тогда, когда более-менее сформировано понимание БП и можно приступить к кодингу. А сбор БП выглядит слишком уж большим шагом.
    - если основой РУПа считать сосредоточенность на рисках, то у меня это нигде прослеживается.

    Давайте, обменяемся нашими пониманиями на примере какого-нибудь бизнес процесса?
    Например, мы собираемся автоматизировать "Жизнь простого смертного человека" (как если бы мы писали игру Sims).
    Я бы делал это так:
    1. Основные процессы в жизни человека, это "Питаться", "Работать", "Отдыхать", "Удовлетворять физиологические потребности". Нарисовали.
    2. Заходим в "Питаться". Почему-то сразу вспоминаем про холодильник, но при этом понимаем, что холодильник в этом не всегда участвует. Возвращаемся на первый этап и дополняем бизнес-процессы.
    1(а). Основные процессы в жизни человека, это "Питаться дома", "Питаться вне дома", "Работать", "Отдыхать", "Удовлетворять физиологические потребности". Нарисовали.
    2(а). Снова заходим в "Питаться дома". Рисуем Flow: "достать продукты из холодильника", "приготовить поесть", "накрыть на стол", "поесть", "убрать за собой". Есть смутные сомнения, что "убрать за собой" является чем-то не входящим в данный процесс. Записываем мысль в notes, но оставляем так как есть.
    3. Заходим в "достать продукты из холодильника" и начинаем рисовать детальный Flow с входными и выходными объектами. Придумали шаги: "открыть холодильник", "найти нужные продукты", "взять их", "закрыть холодильник". Теперь надо приписать им входные и выходные объекты. Что может быть входным объектом для шага "открыть холодильник"? Очевидно, что сам холодильник. А где мы его взяли? Купили! Возвращаемся к первому шагу и дописываем BusinessCase.
    1(б). "Питаться дома", "Питаться вне дома", "Работать", "Отдыхать", "Удовлетворять физиологические потребности", "Покупать товары". Возвращаемся в третий шаг.
    3(а). Шагу "открыть холодильник" во входной объект поставили "холодильник", в качестве правила тут же приписали "мы должны иметь холодильник" в notes (возможно, это будущий exception). Что поставить шагу "открыть холодильник" в качестве выходного объекта? Видимо "набор имеющихся продуктов перед глазами" - формулировка ни к чёрту, но оставим пока так. Следующий шаг "найти нужные продукты". У него во входных данных будет набор видимых продуктов и....? должно быть что-то ещё, иначе мы захапали бы все продукты сразу. Ага - нужен список требуемых продуктов. А он обычно рождается из какого-нибудь рецепта (пусть даже из головы). Значит возвращаемся к шагу 2.
    2(б). Меняем шаги: "решить, что будем готовить", "достать продукты из холодильника", "приготовить поесть", "накрыть на стол", "поесть", "убрать за собой". Возвращаемся в шаг 3.
    3(б). Есть список нужных продуктов, есть список имеющихся в холодильнике. Где-то тут будет исключение "не всё найдено" - пишем в правила в notes. Хочется совместить шаги "найти нужные продукты" и "взять их" - ок, делаем так, называем новый шаг "взять нужные продукты" и в выходные данные ставим "нужные продукты на столе". Откуда стол? Добавляем "стол" во входные объекты. Далее шаг "закрыть холодильник" - во входных данных у него холодильник, а в выходных гм... опять холодильник что ли?... Ага! Значит холодильник меняет состояния. Вводим для объекта "холодильник" два состояния "открытый" и "закрытый" и добавляем их к "холодильникам" в шагах "открыть холодильник" и  "закрыть холодильник".
    4. Проходим по уже нарисованным диаграммкам и решаем, что автоматизировать мы будем полностью шаг "достать продукты из холодильника" (можно и лишь частично его автоматизировать, но он у нас и так короткий). Видим список системных требований "система должна позволять открыть холодильник", "система должна сопоставлять имеющиеся продукты с нужными" и т.п.
    5. Знаем, что понадобятся объекты "холодильник", "продукт", "список продуктов", "стол" и т.п.
    6. Нефункциональные требования пропустим, ибо я уже жрать хочу ))
    7. Представляем себе код - понадобятся вспомогательные классы для сверки списков, нужны абстракции для продуктов, думаем, как будет меняться состояние холодильника и т.п. Если надо рисуем.
    8. Пишем, что надумали. По ходу возвращаемся в предыдущие этапы, меняем что-то, рефакторим и т.д.

    Был бы  признателен за подобную пошаговую инструкцию "а как вы разрабатываете софт"?
  • Программирование :: .NET технология от и до :: ASP.NET
  • И опять здравствуйте :о)

    Есть у меня 2 таблицы в бд. "Lessons" и "Subjects". В первой хранятся данные урока (ID, номер лекции, название и т.д.), а во второй - перечень тем (ID, ID лекции, которой принадлежит тема, номер темы, название и т.д.).

    Хочу сделать страничку, выводящую список лекций и ее тем.

    лекция №1 [название]1.[тема]
    2.[тема]
    3.[тема]
    лекция №2 [название]
    1.[тема]
    2.[тема]
    ...

    Для этого хочу сделать Repeater (для тем), вложенный в Repeater (для лекций)

    То, что есть сейчас: .aspx
    Код:
    <asp:Repeater ID="repLectures" runat="server">
        <ItemTemplate>
      <tr>
        <td colspan="2">
          <b><%# DataBinder.Eval(Container.DataItem, "Lesson_num") %>. <%# DataBinder.Eval(Container.DataItem, "Name") %><br /><hr class="Lessons" /></b>
        </td>
      </tr>
      <tr>
        <td style=""" width:30px"></td>
        <td> <%#DataBinder.Eval(Container.DataItem, "Description")%></td>
      </tr>
      <tr>
        <td>
          <table>
           <tr>
            <td>
       <asp:Repeater ID="repThemes" runat="server">         
               <ItemTemplate>         
                  <td><%# DataBinder.Eval(Container.DataItem, "Theme_num")%>.  <a href="Default.aspx?lesson=<%# DataBinder.Eval(Container.DataItem, "Theme_Name") %>"><%#DataBinder.Eval(Container.DataItem, "Title")%></a></td>         
               </ItemTemplate>
             </asp:Repeater>
             </td>
            </tr>
            <tr>
              <td>Вопросы</td>
            </tr>
            </table>       
        </td>
      </tr>
          </ItemTemplate>
      </asp:Repeater>

    и .aspx.cs
    Код:
      repLectures.DataSource = DB.GetItems("S_EducationOnLineStudent_ListLectures");// вызываю свой класс и хранимую процедуру для выборки из таблицы Lessons
            repLectures.DataBind();
    Вопрос -
    1, как из этого DataBind вытащить ID лекци? (DataBinder.Eval("ID_Lesson") не работает)
    2, можно ли в принципе делать вложенные Repeater-ы? :-/
  • Программирование :: С/С++ :: ANSI С/С++
  • Здравствуйте, посоветуйте книгу по C++ для начала нетрудную?
    И скажите: действительно не важно, какая версия программы?  :thumbsup:
  • Программирование :: С/С++ :: WinAPI & Visual C++
  • Всем привет!
    Не ругайтесь, что снова завожу тему про работу с com-портом.
    Я просмотрел все материалы, которые нашел на сайте и в Интернете (не все, конечно, т.к. это невозможно).

    В общем такая ситуация:
    Я работаю с портом в асинхронном режиме.

     У меня есть поток, который читает данные и основной процесс, в котором я пишу данные в порт.

    В итоге он постоянно мне выводит "Протекает наложенное событие ввода-вывода". Даже если он отправляет в порт, то не читает. Я этот класс давно написал, и раньше вроде все работало, а сейчас...
    Да, когда писал, основывался в основном на книге Агурова
    Привожу код:

    Инициализирую:
    Код:
                   // чистка структуры
    memset(&m_dcb,0,sizeof(m_dcb));
    // заносим значения по умолчанию
    m_dcb.DCBlength = sizeof(m_dcb);
    m_dcb.BaudRate = CBR_9600;
    m_dcb.ByteSize = 8;
    m_dcb.fParity = NOPARITY;
    m_dcb.StopBits = ONESTOPBIT;
    // Windows поддерживает только бинарный режим работы
    m_dcb.fBinary = 1;

                   // Устанавливаем тайм-ауты по умолчанию
    m_commTimeouts.ReadIntervalTimeout = MAXDWORD; // MAXDWORD
    m_commTimeouts.ReadTotalTimeoutConstant = 0;
    m_commTimeouts.ReadTotalTimeoutMultiplier = 0;
    m_commTimeouts.WriteTotalTimeoutConstant = 0; //200
    m_commTimeouts.WriteTotalTimeoutMultiplier = 0;

    Открываю порт
    Код:
    void CComPort::DoOpenPort()
    {
    CString comName;

    // Если порт открыт, то выходим
    if (GetConnected()) return;

    // Имя порта
    comName.Format("\\\\.\\COM%-d", m_nComNumber);

    // Открытие последовательного порта
    m_handle = CreateFile(comName, GENERIC_READ | GENERIC_WRITE,
    0, // неразделяемый ресурс
    NULL, // нет атрибутов защиты
    OPEN_EXISTING, // вернуть ошибку, если ресурс не существует
    FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, // асинхронный режим доступа
    NULL // должно быть NULL для COM-портов
    );

    // Если ошибка открытия порта, то генерируем сообщение "Отказано в доступе"
    if (!GetConnected())
    throw ERROR_ACCESS_DENIED;
    // Инициализация порта
    ApplyComSettings();
    ApplyComTimeouts();
    }

    Пишу в буфер
    Код:
    bool CComPort::WriteBuffer(const BYTE* buffer, const int size)
    {
    DWORD realWrite, signaled, bytesTrans, mask;
    OVERLAPPED writeOL; // структура для асинхронной записи
            bool ret;

    // создание событие для асинхронной записи
    memset(&writeOL, 0, sizeof(writeOL));
    writeOL.hEvent = CreateEvent(NULL, TRUE, TRUE, NULL);
    // начало асинхронной записи
    if (WriteFile(m_handle, buffer, size, &realWrite, &writeOL) == 0)
    if (GetLastError() != ERROR_IO_PENDING) {
    CloseHandle(writeOL.hEvent);
    return false;
    }
    // ожидание завершения асихронной операции и получение результата
    signaled = WaitForSingleObject(writeOL.hEvent, INFINITE);
    ret = signaled == WAIT_OBJECT_0 && GetOverlappedResult(m_handle, &writeOL, &bytesTrans, FALSE);
    // Закрытие дескриптора сигнального объекта
    CloseHandle(writeOL.hEvent);
    return ret;
    }

    И наконец читаю
    Код:
    UINT ReadDataFromPortOfGSMModem(LPVOID pParam)
    {
    DWORD avaibleBytes, // Число полученных, но не прочитанных байт
      errCode, // Код ошибки
      realRead,
      signaled,
      mask,
      bytesTrans, // Не испльзуется для WaitCommEvent
      dwCurSizeBuf = 0; // Текущий размер буфера, т.е. сколько байт данных в буфере
    OVERLAPPED readOL; // Структура для асинхронного чтения
    BYTE inBuffer[MAX_SIZE_BUFFER]; // Буфер приема
    COMSTAT currentState;
    UINT ret = 0;

    CSmsSender* pSender = (CSmsSender*) pParam;
    CComPort* pPort = (CComPort*) pSender->GetPort();

    try {
    // очистка буфера
    memset(inBuffer, 0, sizeof inBuffer);
    // создание событие для асинхронного чтения
    readOL.Internal = readOL.InternalHigh = readOL.Offset = readOL.OffsetHigh = 0;

    readOL.hEvent = CreateEvent(NULL,// аттрибуты защиты такие же как и у родительского процесса
    TRUE, // режим управления событием ручной
    TRUE, // в сигнальном состоянии
    NULL); // безымянный

    while (pPort->GetConnected()) { // пока порт открыт

    // Маска событий, которые будет отслеживать читающий поток
    // Пока это только получение символа
    SetCommMask(pPort->GetHandle(), EV_RXCHAR);// | EV_TXEMPTY
    // Ждем одно из событий
    WaitCommEvent(pPort->GetHandle(), &mask, &readOL);
    // Ждем пока завершится операция чтения
    signaled = WaitForSingleObject(readOL.hEvent, INFINITE);
    switch (signaled) {
         case WAIT_OBJECT_0:
    if (GetOverlappedResult(pPort->GetHandle(), &readOL, &bytesTrans, FALSE)) {
    // После GetOverlappedResult в переменной mask, которая передавалась в WaitCommEvent,
    // появятся флаги произошедших событий, либо 0 в случае ошибки
    if (( mask & EV_RXCHAR ) != 0) {
    // получаем состояние порта (линий и модема)
    currentState = pPort->GetState(errCode);
    // Число полученных, но не прочитанных байт
    avaibleBytes = currentState.cbInQue;
    if (avaibleBytes > 0) {
    if (ReadFile(pPort->GetHandle(), (inBuffer + dwCurSizeBuf), avaibleBytes, &realRead, &readOL)) {
    dwCurSizeBuf += avaibleBytes;
    if (pSender->IsDataReceived(dwCurSizeBuf, inBuffer)) {
    // Пакет получен полностью, предварительная обработка
    pSender->GetCritSectWS_Buf()->Lock();
    pSender->CopyToBuffer(dwCurSizeBuf, inBuffer);
    pSender->GetCritSectWS_Buf()->Unlock();
    // Установить событие
    pSender->SetEvent();
    // Обнулить текущий размер буфера, т.е. буфер пуст
    dwCurSizeBuf = 0;
    // очистка буфера
    memset(inBuffer, 0, sizeof inBuffer);
    }
    }
    }
    }
    }
    break;
    case WAIT_TIMEOUT:
    // Действия, которые необходимо сделать, если превышен интервал ожидания
    break;
    case WAIT_FAILED:
    // Ошибка вызова WaitForSingleObject
    break;
    }
    }
    }
    catch(...) {
    ret = 1;
    }
    // Закрытие дескриптора сигнального объекта
    CloseHandle(readOL.hEvent);
    // Сброс события и маски ожидания
    SetCommMask(pPort->GetHandle(), 0);

    return ret;
    }

    Подскажите пожалуйста
  • День добрый! В С++, а тем более в WinAPI новичок. Возникла такая проблема - необходимо при активации операции рисовать 1 раз сложные объекты в CBitmap'e, а в OnDraw вызывать только перерисовку энтого  CBitmap'а. Дело в том, что запускать метод прорисовки фигур в OnDraw слишком дорого - тысячи точек, сложные циклы.
    Пробовал рисовать сложные фигуры в другой CDC, и потом выводить его (BitBlt) его в OnDraw, но при вызове Invalidate() этот "другой" CDC, точнее, то, что в нем было - вроде бы опустошается. Подскажите технологию, куда копать. Заранее благодарен.
  • Доброго времени суток!

    Есть проблема!
    По нажатию правой кнопки мыши выбрасываю меню. В нем 8 пунктов. При наведении на каждый (там маленькая стрелочка нарисована)) из него выпадает сбоку субменю. Эти субменю для каждого из 8 пунктов !одинаковы! снаружи и должны выполнять схожие действия. Я не хочу копировать 8 одинаковых субменю, это как-то безрадостно, хочу сделать одно. А действия его будут различаться в зависимости от номера родительского пункта (одного из 8)

    Как сделать, чтобы это единое, созданное мной субменю, вылетало при наведении курсора на каждый из 8 пунктов?!
    Где можно это отследить и как? Родительское меню создано в конструкторе, Не руками. (VS 2005/ MFC+WINAPI) 

    Заранее благодарен! 
  • Программка создает текстовый файл в формате rtf. Подскажите, пожалуйста, как открыть этот файл в редакторе ms word. Т.е. файл создан и отправлен на просмотр в редактор.
    Наверное, необходимо сначала узнать, установлен ли на машине word, потом найти исполняемый файл, запустить его, и переслать свой файл в запущенный редактор. Подскажите, как это делается?
  • Здравствуйте, в продолжение старой темы
    http://forum.shelek.ru/index.php/topic,22836.0.html

    Выяснилось неприятное обстоятельство в полученном решении. При перемещении скролла фон окошка меняет свой цвет. см. картинку. Это можно устранить заливкой или выводом фоновой картинки, но при наличии контролов в диалоге простая заливка не проходит, а фоновая картинка не влияет на фон контролов, который продолжает менять цвет при движении скролла вниз - вверх. В чем тут причина, и как это можно устранить?
    Программка прилагается. Для проверки фона контролов хорошо подходят обычные текстовые контролы диалога.
  • У меня есть только файлы dll и lib, и то lib сгенерирован из dll с помощью программы Dll2Lib, h-файла нет. Хочу подключить библиотеку неявно, скажите, такое подключение может работать?
    #pragma comment(lib, "NeuroNet.lib")

    У меня почему-то не работает, вероятно, не видит библиотеку, не отображает её в ClassView. А может просто функции не так вызываю...

    Пробовала подключить через Project -> Linker -> Input -> Additional Dependencies, всё равно библиотеку не видит.
    Может дело в том, что нет h-файла? Тогда вопрос: как его получить??
    Или я просто что-то не правильно делаю?

    И как пользоваться функциями из dll?

    Заранее спасибо!
  • Всем доброго времени! У меня интересный вопрос. Как мне спалить подключение к USB устройства хранения данных, и если подключено оное, то скинуть туда инфу? Благодарю.
  • Программирование :: С/С++ :: Borland C/C++
  • Программа разрабатывалась в нормальной среде например в Windows XP на C++ Builder с поддержкой
    русских шрифтов Cyr, т.е в ее итерфейсе (подписях, названиях меню, справке) использовался русский язык. Надо  чтобы она корректно отображалась в том числе и при работе на компьютере скажем, в другой стране с отсутствием русскоязычной поддержки.

    Какие могут быть в этом случае рекомендации? Только лишь сменить русский язык?  или как-то может
    с самого начала разработки использовать Unicode ?
    Сейчас знакомые в США, которым я передал программу, не могут прочитать обозначения интерфейса
    из-за проблем с русским шрифтом. Был передан лишь exe без всяких инсталляторов
  • Программирование :: Delphi
  • Возможно ли переопределение  свойства Strings используемого например
    в классах TListBox, TCombobox?

    Если возможно, то что надо делать?
    Писать класс наследник от TListBox?
    Но ведь он имеет свойство Items, а свойство-массив Strings - свойство
     не TListBox, а Items
    Такая попытка Писать класс наследник от TListBox  
    type
      TRec=record
        N: Integer;
        txt1: ShortString;
        txt2: ShortString;
      end;
      TLB_List = class(TListBox)
      protected
       function GetItms : TRec; procedure SetItms(val: Trec);
     public
       property Items:TRec read GetItms   write SetItms;
      constructor Create(aOwner: Tcomponent); override; //Êîíñòðóêòîð
     end;
    приводит лишь к тому, что при вызове экземпляра класса
    lм:=TLB_List.Create(Form1);
    мы не можем обратиться, как ранее, скажем  lv.Items.Strings
    а только lv.Items
    может, пойти на объявление Items свойством-массивом типа TRec?
    (тогда хотя старое Items.Strings будет недоступно, все равно будем пользоваться
    списком как массивом.) Хотелось бы еще чтобы при добавлении/удалении
    сохранялись визуальные свойства нового списка.
  • Уважаемые форумчане! Не мог бы кто-нибудь из вас подсказать, как можно считывать с файла по 1-му символу? Это необходимо мне для заполнения массива. Вот примерно так:
    Код:
    Пока (i не равен концу файла) делать
    Массив[i]:=Read(по одному байту с начала файла);
    i:=i+1;
    Функция конца файла :
    Код:
    procedure gotoeof (var f:file);
    begin
    seek (f, 0);
    seek (f, filesize(f));
    end;
    p.s.Функция взята с h**p://delphiworld.nar*d.ru.
  • При написании обработчика события SetEditText  (скажем, для StringGrid) обратил внимание, что оно срабатывает дважды.
    Т.е. дважды вызывается соответствующая функция-обработчик.
    Можно ли эту ситуацию как-то изменить?
  • Программирование :: VisualBasic
  • Столкнулся с этой проблемой в Word VBA, поэтому пишу тут. Но, думается, это в любом языке актуально!
    Суть проблемы: создается ListView в юзерформе, переключается в режим report, включаются чекбоксы.
    Код:
    Private Sub UserForm_Initialize()
        With ListView1
            .ColumnHeaders.Add Text:="Столбец 1"
            .View = lvwReport
            .Checkboxes = True
            .ListItems.Add Text:="Blackberry"
        End With
    End Sub
    Всё хорошо!
    Далее по клику прячем этот контрол:
    Код:
    Private Sub CommandButton1_Click()
        ListView1.Visible = False
    End Sub
    - опять ничего неожиданного. Второй кнопкой возвращаем контрол, заодно добавив элемент:
    Код:
    Private Sub CommandButton2_Click()
        ListView1.Visible = True
        ListView1.ListItems.Add Text:="Strawberry"
    End Sub
    Опаньки! У нового элемента есть чекбокс, а у старого - нету!
    Если нажать на обе кнопки еще раз, у нас будут два элемента без чекбоксов и один - с ним.
    А теперь, собственно, вопрос: как сделать, чтобы чекбоксы отображались после hide?

    UPD: Наловчился прятать его за границы юзерформы (не скрывая). Видимо, это единственное решение...  :dontknow:
  • Программирование :: VisualBasic :: Visual Basic for Applications
  • Всем привет)
    Не поможете ничего не понимающему в VB человеку?)

    Есть такой макрос (в строке проверяет значение в определённой ячейке, если она пустая, скрывает всю строку):

    Range("d5:d5").Select 'выбор проверяемой ячейки
    If Range("d5") = 0 Then 'сравнение с нулем
    Rows("5:5").Select 'выбор строки
    Selection.EntireRow.Hidden = True 'скрыть строку
    Помогите, пожалуйста, изменить его, чтобы он действовал не на одну строку, а на всю таблицу, скрывая в ней все строки в которых присутствует пустая ячейка в диапазоне d5:d100

    Заранее благодарен за помощь)
  • Гуру, помогите, пожалуйста :)
    Мне надо, чтобы ячейки проверялись на равенство значений и, если они равны, то только тогда переносится значение из третьей ячейки второй книги в первую.
    Помогите, пожалуйста, очень надо сравнить большой массив, а я в VBA никогда не программировал.
    Смотрел хелп, но там ничего нет.
    Код:
    Public Sub Compare()
        Dim i As Integer
        Dim j As Integer
        Dim wb As Excel.Workbook
        
         Set wb = Excel.Workbooks("Книга1.xls")        'получаем экземпляр книги с которой нужно сравнивать

        'проверить 100 строк
        For i = 1 To 100
                If ThisWorkbook.Worksheets("Лист1").Cells(i, 2) <> wb.Worksheets("Лист1").Cells(j, 1) Then
                    ' в столбец С пишем значение из столбца В книги 1
                    j = j + 1
                    Else
                    ThisWorkbook.Worksheets("Лист1").Cells(i, 5) = wb.Worksheets("Лист1").Cells(i, 2)
                End If
        Next i
    End Sub

  • Как сделать, чтобы вытягивать текст с 3-х первых найденных ячеек с 6-ти, и делило любое число из 3-х первых найденных на 2 и вставляло результат в остальные 3-и. И выделяло красным цветом.

    Код:
    Private Sub CommandButton5_Click()

    Dim tbl As Table, cll As Cell, i As Long
    i = 0


    For Each tbl In ActiveDocument.Tables
      For Each cll In tbl.Range.Cells
        If IsNumeric(Replace(cll.Range, Chr(13) + Chr(7), "")) Then i = i + 1 Else i = 0
       
       
        If i = 6 Then

        cll.Range.Shading.BackgroundPatternColor = RGB(255, 0, 0)
        cll.Range.Text = Val(cll.Range.Text) / Val(2)

          i = 0
         
        End If
      Next
    Next

    End Sub
    Задача_Пример
  • Программирование :: Программирование 1С
  • Уважаемые специалисты, подскажите пожалуйста. У меня Альфа-авто сетевая версия под 1С V7.7. В журнале ЗаказНаряды внизу возможность отбора документов: - Первый уровень, это по контрагенту либо по состоянию (одно из двух). Но мне этот уровень совершенно не нужен и всегда установлено "По состоянию", иначе не отображает док-ты; - Второй уровень, если первый установлен "По состоянию", то во вкладках - "Стоянка", "Заявка", "В работе", "Закрыт". Но пока что-то из этих значений не выберешь, - ничего не отображает как бы я ни мучился. Однако такого казуса не наблюдается в журнале "Общий". Там отображается абсолютно всё. Однако я бы с этим и жил, но нужно сделать чтобы разом в журнале отображались заказ-наряды закрытые, проведённые, в состоянии заявки и во всяких возможных состояниях.
    Как мне устранить сей глюк? Или это глюк у меня? К программированию 1С я отношения никакого не имею, однако знаком с ассемблером микроконтроллеров и могу даже написать для них незамысловатую программку.

    Как у человека владеющего элементарной логикой, - у меня создалось впечатление, что где-то ошибка в программе, которая заключается в следующем: Если не выбрано значение отбора, то никакие док-ты не отображаются. А мне надо наоборот. Если не выбрано значение - отобразить в журнале все документы. А отборы нихай себе будут, дабы при необходимости отфильтровать ненужное.

    Заранее благодарю за ответ
  • Создаю форму справочника на форме несколько полей ввода записываю данные в поля потом снова захожу в форму, а поля пустые может кто-нибудь знает в чём дело?
  • Программирование :: Программирование 1С :: 1С 8.x
  • Разбираюсь с 1С и никак не могу понять, для чего нужен ПланВидовХарактеристик. В принципе, задать свойства, например, того же материала можно, просто создав табличную часть. И особенно мне не ясно значение ДополнительноеЗначениеХарактеристик, ведь все известные данные можно описать с помощью строки, числа, булево. Может, кто-нибудь сможет мне объяснить?
  • Начну с самого начала.
    Выгрузили из УТ в БП. Заменилась вся номенклатура, потому что почему-то номера из УТ тоже выгружаются.
    Решили сделать префикс в базе БП для того, чтобы не заменялось ничего.
    Для документов сделали, а вот для номенклатуры не знаем как сделать.

    Может, кто-нибудь что-нибудь посоветует в этой ситуации?
  • Постоянно в макетах и регистрах такая переменная ТекСтрокаСписокМатериалов. Откуда она берётся и чему равняется? Её не объявляют?
  • Делаю выборку из другого справочника, значение ключа передаю из текущей строки (текущиеданные.столбец), потом к выборке применяю ПолучитьОбъект и указываю имя нужного мне реквизита для получения значения в переменную, запускаю 1с, а он сообщает мне, что элемент не выбран, как будто выборка не получает значение ключа. С чем это может быть связано?
  • Доброго времени суток! Возникла следующая ситуация: в организации установлен префикс А, при при формировании счет-фактур по документу с видом счет-фактуры "на реализацию" подставляется номер документа на основании которого вводится счет-фактура, но как только вводится новая-счет фактура с видом "на аванс" подставляется префикс А(получается АА) и порядковый номер с данным префиксом(как я понял, что данный вид имеет по умолчанию префикс А), затем когда вводятся новые счет-фактуры с видом "на реализацию" то нумерация продолжается с префиксом АА и номером по порядку, что не правильно, так как документ имеет префикс А. После мозгового штурма было принято решение, изменить префикс организации на другой, соответственно необходимо во всех документах которые были выписаны с префиксом А изменить префикс. Думал написать обработку, но потом столкнулся с проблемой, что не знаю как выбрать все документы хранящиеся в базе с префиксом А. Подскажите как выбрать все документы с префиксом А, может быть существует другой какой-нибудь способ изменения префикса, кроме как написание обработки?
  •  В ТаблицуЗначений данные попадают не из запроса, а из текстового файла. Выгружаю данные из Таблицы значений в поле табличного документа. И чего-то не пойму как все это делается. Может у кого-нить есть соображения как выгрузить данные? Помогите! Поделитесь!
  • Здравствуйте!
    У меня вопрос по регистрам сведений.
    Если регистр сведений (РС) не подчинен регистратору и непериодический, то для его редактирования и чтения можно использовать как РегистрСведенийМенеджерЗаписи.<Имя регистра сведений>, так и  РегистрСведенийНаборЗаписей.<Имя регистра сведений>.
    В принципе с помощью, и того, и этого можно добиться желаемого результата, так в чем разница принципиальная?
  • Операционные системы :: Windows
  • Доброго всем времени суток.
    Такой вот вопрос.
    Никому не приходилось сталкиваться с официальным удалением предустановленной Windows с нового ноутбука?
    В своё время, совсем недавно, была большая шумиха по этому поводу.
    На днях я приобрёл ноутбук Asus с предустановленной Windows 7 HB 64.
    Поскольку мне требуется Professional или Ultimate, остановился на Professional - неохота платить за то, что не очень-то и надо (BitLock, DirectAccess и 35 языков), обратился в сервис и был очень удивлён тем, что я первый.
    В течение двух дней обещали вернуть технику и 26USD.
    Кстати, маленький расчёт: 26USD за 4 часа, которые я в итоге потрачу, умножим на 42 (21 рабочий день по 8 часов) = 1092USD в месяц - для Уфы неплохой приработок.
  • Привет всем!
    Помогите, пожалуйста, может, кто-нибудь сталкивался с такой проблемой.
    У меня ноутбук HP Probook 4310s. На нем операционка Windows 7 Home premium. Проблема в том, что когда печатаешь, все время вылетает такая менюшка, похожая на меню при нажатии правой кнопки мышки. Менюшка вылетает при нажатии различных клавиш или когда вообще не трогаешь клавиатуру. Достало жутко. Проблема была с самого начала, когда купили компьютер. Я точно помню, что в магазине демонстрационный экземпляр был с такой же проблемой. Сегодня звонила в НР, инженер сказал, что это, типа, проблема в Windows, что он не думает, что это что-то с клавиатурой. А вот у меня сомнения, что мне вообще делать. То ли Windows переставить, как инженер посоветовал, то ли в сервис везти. Компьютеру всего пара месяцев. Подскажите, пожалуйста, может, у вас будут какие-нибудь соображения на эту тему?
  • Операционные системы :: Unix и другие
  • Необходимо настроить нормальную работу с FTP в Total Commander через 'squid'. сейчас работает так, что в Total Commander в настройках FTP соединения проставляется HTTP-прокси с поддержкой FTP, но не работают многие комманды. Файл на FTP нельзя удалить, переименовать, создать каталог. Есть ли другой вариант настройки работы с FTP через 'squid'?
  • Направления программирования :: Drivers
  • Доброго времени суток.
    Пишу фильтр-драйвер для флешек (всех подключенных и подключаемых). За все mass storages отвечает usbstor.sys - классовый драйвер. Вопрос: какой ClassGUID использовать, чтоб фильтр-драйвер на usbstor.sys повесить?  В MSDN сказано, что ClassGUID={36FC9E60-C465-11CF-8056-444553540000} - не для периферии.
  • Приветствую всех!
    Стоит задача по работе с PCI-платами в Windows XP. Проработал несколько источников, названия основных в конце этого поста, источник [1] у меня в pdf, а [2] в печатном виде.  

    В [1] на стр.129 написано о функциях BIOS, доступных как в кольце 3, так и кольце 0. А на стр. 130 указано об использовании каталога 32-разрядных сервисов, в частности для «поиска устройства по идентификатору».
    1. Кто-то использовал данные сервисы в Windows NT5.0, насколько это целесообразно?
    2. Почему в [2] об этих сервисах ничего не сказано, ведь они, похоже, полезны?
    3. Где можно подробней прочесть о работе с данными сервисами применительно к PCI устройствам?

    Литература:
    1. Гук М. Ю.  Шины PCI, USB и FireWire. Энциклопедия. — СПб.: Питер, 2005. — 540 с.
    2. Солдатов В.П. Программирование драйверов Windows. Изд. 3-е, перераб. И доп. – М: ООО «Бином-Пресс», 2006 г. – 576 с.
  • Направления программирования :: Web
  • Как написать отельные стили CSS для браузера Opera 9 и более старых, чтобы в Opera 10 уже эти стили не работали?
  • Такой вопрос. Есть мешанина данных типа:

    Код:
          <paragraph>
            текст текст текст текст текст текст
          </paragraph>


          <paragraph>
            текст текст текст<product>ABC</product> текст текст текст текст текст
            текст <emphasis>Выделеный</emphasis> текст текст текст текст текст текст
            <list>
                 <item>1</item>
                 <item>2</item>
                 <item>3</item>
            </list>
            текст текст текст текст текст текст
          </paragraph>


    Должно получиться типа такого:

    Цитировать
    текст текст текст текст текст текст

    текст текст текст ABC текст текст текст текст текст текст Выделеный текст текст текст текст текст текст
        
    • 1
    • 2
    • 3
    текст текст текст текст текст текст

    Те в теге paragraph может быть просто текст, который надо отображать, а могут быть ещё другие вложенные структуры, которые в свою очередь также могут иметь подструктуры. Например, элемент списка может представлять собой несколько paragraph-оф или содержать другие списки. И тд и тп

    Я сделал такие шаблоны для одиночных элементов:

    Код:
      <xsl:template match="product" name="product_templ">
        <h3>
          <xsl:value-of select="."/>
        </h3>
      </xsl:template>

      <xsl:template match="emphasis" name="emphasis_templ">
        <b>
          <xsl:value-of select="."/>
        </b>
      </xsl:template>

      <xsl:template match="list">
        <ul>
          <xsl:for-each select="item">
            <li>
              <xsl:value-of select="."/>
            </li>
          </xsl:for-each>
        </ul>
      </xsl:template>

      <xsl:template match="paragraph">
        <p>
          <xsl:value-of select="."/>
        </p>
      </xsl:template>

    А как строить шаблоны для сложных (вложеных) структур? Описывать правила для сложных структур (например для текста со списком и тд до умопомрачения, на все случаи жизни) или же можно использовать автоматом готовые шаблоны внутри друхих шаблонов типа "apply select=нужный шаблон"?

    Число примитивных структур конечно и изначально известно, но их сложность и глубина вложенности могут быть произвольными. К примеру, генератор генерит абзац, который содержит список и в этом списке попадается название продукта.
  • Направления программирования :: Web :: HTML/DHTML
  • Есть код:
    Код:
    <!DOCTYPE html>
    <html>
    <head>
    <title>Авторизация</title>
    <style type="text/css" href="style.css" />
    </head>
    <body>
    <form action="login.php">
    <label for="login"><input type="text" id="login" name="login" />
    <label for="password"><input type="password" id="password" name="password" />
    <input type="submit" value="Войти" />
    </form>
    </body>
    </html>
    Этот код менять нельзя, можно писать только css. Форма должна быть строго по центру экрана. Как выравнять по горизонтали, я понимаю, а как по вертикали?
  • только что в соседней темке произошёл небольшой спор по этому поводу.
    Из самой той темы очевидно одно из соображений: отдельные мелкие глючки в IE6, в частности невозможность использования <input type="search">. Но кстати, лично мне других подобных глючков не известно, а именно на этот смело забивают такие монстры, как например Артемий Лебедев, и не только на своих сайтах, но и на сайтах заказчиков, в том числе крупных банков. Тенденция налицо.
    Сейчас же мало кто из разработчиков оптимизирует код под IE5. Считается, что тот из пользователей, кто до сих пор не обновился до современной версии, сам виноват. Так же сейчас происходит и с IE6. Так что этот недостаток считаю несущественным.
    Соображений за вижу: более осмысленный и красивый код, приятные мелочи вроде атрибутов placeholder, required, менее строгие, чем в xhtml, ограничения.
    Всё же, стоит ли применять html 5 в боевых проектах?
  • Почему в <input type="search"> в браузере IE6 невозможно поместить фокус ввода ни вручную ни скриптом? Как решить эту проблему?
  • Направления программирования :: Web :: Тестирование веб-сайтов
  • в кои-то веки попался нам адекватный и вменяемый заказчик, который не предъявлял никаких дурацких требований, не ползал с линейкой по монитору, выверяя строгую идентичность макету во всех ему известных браузерах. Этот заказчик руководствовался исключительно соображениями здравого смысла. Вот как бывает.
    И захотелось такому заказчику сделать что получше. В том числе и о красоте кода позаботились. И в какой-то момент возникла мысль: «а не переверстать ли на html5?».

    Сказано — сделано. Вот что получилось:
    h**p://advokat.tmweb.ru/

    На самом деле сайт до сих пор ещё в стадии разработки, а потому живёт на тестовом домене, имеет местами ненаполненные страницы, картинку вместо счётчика, один недовёрстанный шаблон компонента (в новостях) и маленький косячок в виде резкого перепада цвета в ссылках основного меню по краю иконок.
    Но основная часть работы выполнена, шаблоны свёрстаны в html5, оформлены средствами css3.

    Никаких сверхнавороченных возможностей html5 использовано не было. В первую очередь были применены новые элементы, такие как <header>, <footer>, <aside>, <nav>, <time>. Естественно же, их поначалу игнорировали все версии IE, но способы решения этой проблемы известны. Простеньким js были созданы незнакомые ослику элементы — и вот оно, счастье.
    Также был применён атрибут placeholder для формы поиска. К сожалению, правильная работа атрибута пока поддерживается только движком webkit, так что для остальных нужную функциональность пришлось реализовывать опять же javascript'ом.
    И ещё в одном месте был применён js: для выпадающего меню. И опять же, только для IE, вернее даже только для шестой его версии. У остальных же браузеров псевдокласс :hover проблем не вызвал :)

    Задача идентичности отображения в разных браузерах не ставилась. Кое-где даже сознательно применены свойства только для webkit.
    Свойствами css3 реализовано большинство градиентов. Браузерам, не поддерживающим css3, предложено вместо градиентов отобразить подходящий цвет кода. Исключение сделано для IE. Он хоть и не понимает общепризнанные стандарты, зато имеет свои, в которых градиенты реализованы куда давнее, чем в головах w3c зародились первые мысли о css3. Правда, реализованы они довольно топорно, но в простейших случаях работают вполне прилично.
    Местами, но редко, встречаются тени и закруглённые углы — опять же, в устаревших браузерах они просто не показываются. Читаемость от этого не страдает нисколько. Повод задуматься о необходимости приводить сайты к идентичному виду в различных браузерах. Усилия себя не оправдывают.

    В ходе работы над этим сайтом был обнаружен странный баг в ФФ. Если задать list-style: decimal для какого-либо элемента, кроме ol, ul, то нумеруются вхождения исключительно нулями. Странного в этом глюке то, что багрепорт у разработчиков висит аж с 1999 года. Мне было крайне сложно удержаться от комментария в коде на этот счёт.

    Отдельной статьёй, конечно, стояла задача организовать вывод чистого и красивого кода из cms 1С-Битрикс. Кто знаком с этой чудо-cms, меня сразу поймёт. Когда ядро сыпет тэгами, да не какими-нибудь, а например <font>, задача становится нетривиальной. Ядро редакторивать нельзя, при первом же обновлении все правки умрут. Сделать ровный код, с правильными отступами, без лишних пустых строк — тоже не самая простая задача в Битриксе. Тут, к сожалению, местами пришлось применять костыли вплоть до регулярных выражений в шаблонах.

    Вот. Поругайте теперь вы наше творчество :)
  • Практические разделы :: Базы данных
  • Доброе время суток,
    давно работаю с SQL Server из VC++6 небыло проблем, теперь необходимо сохранить приличный объем данных (32кБ) бинарных данных, и тут косяк, с тем что предлагает студия при создании проекта (там указатель создается), не подключается к базе, как строкой читать из базы получается, а писать в базу никак. Пожалуйста помогите кто знает.
  • Есть рабочая цепочка компьютеров - это Локальный компьютер -> Сервер Приложений -> MS SQL Server
    Суть заключается в чем, из-за объемных обработок документов в Сервере Приложений была проблема в нехватке памяти. Собрали тестовый Сервер Приложений, который в дальнейшем бы заменили на рабочий Сервер Приложений, тестовый Сервер Приложений отработал все необходимые процедуры обработок с документами и с записью обработок в БД MS SQL Server. Вчера, когда я менял местами Сервер Приложений и тестовый Сервер Приложений, началась проблема с открытием БД, хранящейся на SQL Server, когда меняю Серверы Приложений обратно местами, все работает (ОС Сервер Приложений - win server 2003 enterprise х32, ОС тестовый Сервер Приложений - win seven prof x64, ОС MS SQL Server - win server 2003 enterprise х32). Есть еще одна цепочка компьтеров: Локальный компьютер -> Сервер Приложений -> MS SQL Server, меняю в этой цепочке Сервер Приложений на тестовый Сервер Приложений, все нормально работает, доступ к БД хранящейся на SQL Server, происходит намного быстрее, чем в первой цепочке. Конфигурация сети и настройка серверов идентичны друг другу.

    Что можно сделать, чтобы доступ к БД SQL Server в первой цепочке работал также, как во второй цепочке??
  • Практические разделы :: Железо
  • Давно хочу убрать системник из комнаты в кладовку - чтоб не шумел и работал как сервер..
    Из кладовки хочу удлиннителями вынести все что нужно - монитор, клаву и мышку..
    Собственно вопрос.. Какие есть ограничения на длину кабелей?
    * VGA (для CRT монитора)
    * USB
    Например, нашел 5-метровый VGA-удлиннитель (h**p://www.dealextreme.com/details.dx/sku.22958), но в комментариях пишут что качество плохое.. Возможно, получится обойтись 3х метровым, но все-таки...
    Будет ли потеря качества сигнала?
    Кто что может еще посоветовать?
  • Принтер HP DeskJet D1663. Картридж заправлен своими силами.
    Несмотря на то, что он полный, программы полагают, что он пуст.
    По большому счёту, мне плевать на их мнение, лишь бы печатал. Под маком он так и делает.
    Однако под Windows он отказывается печатать на том основании, что картридж якобы пуст.
    Как можно побороть? Вот любой вариант: хоть обучить его понимать, что он теперь заправлен, хоть обучить винду игнорировать состояние картриджа, хоть ещё какой.
  • Практические разделы :: Графика и дизайн
  • Кто подскажет, почему текстура на кубе (на нижней и верхней гранях) не фиксируются как боковые.
    Проходил урок 10 (текстурирование) по книге Горнакова и обнаружил такой глюк. Файл прилагаю, только нужно в проект еще вставить картинку с именем "X.jpg".
  • Учимся программировать :: Начинающим
  • Помогите, пожалуйста, с Qt.
    Есть ли в Qt какой-то класс, который по маске (*.dat) находит все файлы или нужно самому писать?

А теперь прощаемся с Вами до следующего выпуска.


С уважением, команда Клуба.


В избранное