1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. bankesbusters

Beiträge von bankesbusters

  • eine etwas andere uhr mit erweiterten features

    • bankesbusters
    • 7. Juni 2025 um 19:23
    Zitat von argumentum

    Ich muss mich mit Python beschäftigen, da ich angefangen habe, mit LLMs zu spielen, und das ist alles Python. Daher würde ich das Python-Gegenstück begrüßen.

    hi,

    okay ... wie gesagt: stand heute sind die an und abschaltungen von den buttons noch nicht implementiert in dieser version:

    stand 08.06.2025 (09:11): jetzt sind im python code alle buttons mit der an und abschaltfunktion richtig wie in der AutoIt version angedacht.

    Darüber hinaus habe ich noch einen kleinen Fehler bei der manuellen Berechnung in der 'Reset' Funktion behoben. Jetzt ist es wie es sein sollte:

    Python
    import os
    import sys
    from PyQt6 import QtCore, QtGui, QtWidgets
    from PyQt6.QtCore import QTimer, QTime, Qt, QUrl
    from PyQt6.QtWidgets import QApplication, QMainWindow, QMessageBox
    from PyQt6.QtMultimedia import QSoundEffect
    import datetime
    
    
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName("MainWindow")
            MainWindow.resize(341, 766)
            self.centralwidget = QtWidgets.QWidget(parent=MainWindow)
            self.centralwidget.setObjectName("centralwidget")
            self.time_clock = QtWidgets.QLabel(parent=self.centralwidget)
            self.time_clock.setGeometry(QtCore.QRect(20, 60, 301, 41))
            font = QtGui.QFont()
            font.setPointSize(28)
            font.setBold(True)
            self.time_clock.setFont(font)
            self.time_clock.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
            self.time_clock.setAutoFillBackground(True)
            self.time_clock.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
            self.time_clock.setIndent(0)
            self.time_clock.setObjectName("time_clock")
            self.day_and_date = QtWidgets.QLabel(parent=self.centralwidget)
            self.day_and_date.setGeometry(QtCore.QRect(20, 10, 301, 41))
            font = QtGui.QFont()
            font.setPointSize(18)
            font.setBold(True)
            self.day_and_date.setFont(font)
            self.day_and_date.setAutoFillBackground(True)
            self.day_and_date.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
            self.day_and_date.setObjectName("day_and_date")
            self.start_checkbox = QtWidgets.QCheckBox(parent=self.centralwidget)
            self.start_checkbox.setGeometry(QtCore.QRect(15, 140, 51, 20))
            self.start_checkbox.setObjectName("start_checkbox")
            self.stop_checkbox = QtWidgets.QCheckBox(parent=self.centralwidget)
            self.stop_checkbox.setGeometry(QtCore.QRect(280, 140, 51, 20))
            self.stop_checkbox.setObjectName("stop_checkbox")
            self.Checkbox_Timer = QtWidgets.QLabel(parent=self.centralwidget)
            self.Checkbox_Timer.setGeometry(QtCore.QRect(70, 140, 201, 21))
            font = QtGui.QFont()
            font.setPointSize(18)
            font.setBold(True)
            font.setItalic(True)
            self.Checkbox_Timer.setFont(font)
            self.Checkbox_Timer.setAutoFillBackground(True)
            self.Checkbox_Timer.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
            self.Checkbox_Timer.setObjectName("Checkbox_Timer")
            self.manual_start_hours = QtWidgets.QComboBox(parent=self.centralwidget)
            self.manual_start_hours.setFixedWidth(45)
            self.manual_start_hours.setGeometry(QtCore.QRect(130, 180, 31, 22))
            self.manual_start_hours.setEditable(False)
            self.manual_start_hours.setStyleSheet("QComboBox { text-align: center; }")
            self.manual_start_hours.setObjectName("manual_start_hourss")
            self.manual_start_minutes = QtWidgets.QComboBox(parent=self.centralwidget)
            self.manual_start_minutes.setFixedWidth(45)
            self.manual_start_minutes.setGeometry(QtCore.QRect(180, 180, 31, 22))
            self.manual_start_minutes.setEditable(False)
            self.manual_start_minutes.setStyleSheet("QComboBox { text-align: center; }")
            self.manual_start_minutes.setObjectName("manual_start_minutes")
            self.manual_start_seconds = QtWidgets.QComboBox(parent=self.centralwidget)
            self.manual_start_seconds.setFixedWidth(45)
            self.manual_start_seconds.setGeometry(QtCore.QRect(230, 180, 31, 22))
            self.manual_start_seconds.setEditable(False)
            self.manual_start_seconds.setStyleSheet("QComboBox { text-align: center; }")
            self.manual_start_seconds.setObjectName("manual_start_seconds")
            self.manual_start_milliseconds = QtWidgets.QComboBox(parent=self.centralwidget)
            self.manual_start_milliseconds.setFixedWidth(50)
            self.manual_start_milliseconds.setGeometry(QtCore.QRect(280, 180, 31, 22))
            self.manual_start_milliseconds.setEditable(False)
            self.manual_start_milliseconds.setStyleSheet("QComboBox { text-align: center; }")
            self.manual_start_milliseconds.setObjectName("manual_start_milliseconds")
            self.manual_start = QtWidgets.QLabel(parent=self.centralwidget)
            self.manual_start.setGeometry(QtCore.QRect(20, 180, 110, 20))
            self.manual_start.setAutoFillBackground(True)
            self.manual_start.setObjectName("manual_start")
            self.manual_end = QtWidgets.QLabel(parent=self.centralwidget)
            self.manual_end.setGeometry(QtCore.QRect(20, 210, 110, 20))
            self.manual_end.setAutoFillBackground(True)
            self.manual_end.setObjectName("manual_end")
            self.manual_end_hours = QtWidgets.QComboBox(parent=self.centralwidget)
            self.manual_end_hours.setFixedWidth(45)
            self.manual_end_hours.setGeometry(QtCore.QRect(130, 210, 31, 22))
            self.manual_end_hours.setEditable(False)
            self.manual_end_hours.setStyleSheet("QComboBox { text-align: center; }")
            self.manual_end_hours.setObjectName("manual_end_hours")
            self.manual_end_minutes = QtWidgets.QComboBox(parent=self.centralwidget)
            self.manual_end_minutes.setFixedWidth(45)
            self.manual_end_minutes.setGeometry(QtCore.QRect(180, 210, 31, 22))
            self.manual_end_minutes.setEditable(False)
            self.manual_end_minutes.setStyleSheet("QComboBox { text-align: center; }")
            self.manual_end_minutes.setObjectName("manual_end_minutes")
            self.manual_end_seconds = QtWidgets.QComboBox(parent=self.centralwidget)
            self.manual_end_seconds.setFixedWidth(45)
            self.manual_end_seconds.setGeometry(QtCore.QRect(230, 210, 31, 22))
            self.manual_end_seconds.setEditable(False)
            self.manual_end_seconds.setStyleSheet("QComboBox { text-align: center; }")
            self.manual_end_seconds.setObjectName("manual_end_seconds")
            self.manual_end_milliseconds = QtWidgets.QComboBox(parent=self.centralwidget)
            self.manual_end_milliseconds.setFixedWidth(50)
            self.manual_end_milliseconds.setGeometry(QtCore.QRect(280, 210, 31, 22))
            self.manual_end_milliseconds.setEditable(False)
            self.manual_end_milliseconds.setStyleSheet("QComboBox { text-align: center; }")
            self.manual_end_milliseconds.setObjectName("manual_end_milliseconds")
            self.manual_calculator_button = QtWidgets.QPushButton(parent=self.centralwidget)
            self.manual_calculator_button.setText("Calculate Time Difference")
            self.manual_calculator_button.setGeometry(QtCore.QRect(14, 240, 151, 41))
            self.manual_calculator_button.setObjectName("manual_calculator_button")
            self.manual_result = QtWidgets.QLabel(parent=self.centralwidget)
            self.manual_result.setGeometry(QtCore.QRect(170, 250, 151, 21))
            font = QtGui.QFont()
            font.setPointSize(18)
            font.setBold(True)
            font.setItalic(True)
            self.manual_result.setFont(font)
            self.manual_result.setAutoFillBackground(True)
            self.manual_result.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
            self.manual_result.setObjectName("manual_result")
            self.start_alarmclock = QtWidgets.QPushButton(parent=self.centralwidget)
            self.start_alarmclock.setGeometry(QtCore.QRect(12, 350, 158, 24))
            self.start_alarmclock.setObjectName("start_alarmclock")
            self.stop_alarmclock = QtWidgets.QPushButton(parent=self.centralwidget)
            self.stop_alarmclock.setGeometry(QtCore.QRect(172, 350, 158, 24))
            self.stop_alarmclock.setObjectName("stop_alarmclock")
            self.alarmclock = QtWidgets.QLabel(parent=self.centralwidget)
            self.alarmclock.setGeometry(QtCore.QRect(18, 320, 100, 22))
            self.alarmclock.setAutoFillBackground(True)
            self.alarmclock.setObjectName("alarmclock")
            self.alarmclock_hours = QtWidgets.QComboBox(parent=self.centralwidget)
            self.alarmclock_hours.setFixedWidth(45)
            self.alarmclock_hours.setGeometry(QtCore.QRect(130, 320, 31, 22))
            self.alarmclock_hours.setEditable(False)
            self.alarmclock_hours = QtWidgets.QComboBox(parent=self.centralwidget)
            self.alarmclock_hours.setFixedWidth(45)
            self.alarmclock_hours.setGeometry(QtCore.QRect(130, 320, 31, 22))
            self.alarmclock_hours.setEditable(False)
            self.alarmclock_hours.setStyleSheet("QComboBox { text-align: center; }")
            self.alarmclock_hours.setObjectName("countdown_hours")
            self.alarmclock_minutes = QtWidgets.QComboBox(parent=self.centralwidget)
            self.alarmclock_minutes.setFixedWidth(45)
            self.alarmclock_minutes.setGeometry(QtCore.QRect(180, 320, 31, 22))
            self.alarmclock_minutes.setEditable(False)
            self.alarmclock_minutes.setStyleSheet("QComboBox { text-align: center; }")
            self.alarmclock_minutes.setObjectName("countdown_minutes")
            self.alarmclock_seconds = QtWidgets.QComboBox(parent=self.centralwidget)
            self.alarmclock_seconds.setFixedWidth(45)
            self.alarmclock_seconds.setGeometry(QtCore.QRect(230, 320, 31, 22))
            self.alarmclock_seconds.setEditable(False)
            self.alarmclock_seconds.setStyleSheet("QComboBox { text-align: center; }")
            self.alarmclock_seconds.setObjectName("countdown_seconds")
            self.alarmclock_milliseconds = QtWidgets.QComboBox(parent=self.centralwidget)
            self.alarmclock_milliseconds.setFixedWidth(50)
            self.alarmclock_milliseconds.setGeometry(QtCore.QRect(280, 320, 31, 22))
            self.alarmclock_milliseconds.setEditable(False)
            self.alarmclock_milliseconds.setStyleSheet("QComboBox { text-align: center; }")
            self.alarmclock_milliseconds.setObjectName("countdown_milliseconds")
            self.stopwatch = QtWidgets.QLabel(parent=self.centralwidget)
            self.stopwatch.setGeometry(QtCore.QRect(20, 400, 301, 41))
            font = QtGui.QFont()
            font.setPointSize(28)
            font.setBold(True)
            self.stopwatch.setFont(font)
            self.stopwatch.setAutoFillBackground(True)
            self.stopwatch.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
            self.stopwatch.setObjectName("stopwatch")
            self.start_stopwatch = QtWidgets.QPushButton(parent=self.centralwidget)
            self.start_stopwatch.setGeometry(QtCore.QRect(12, 460, 76, 24))
            self.start_stopwatch.setObjectName("start_stopwatch")
            self.stop_stopwatch = QtWidgets.QPushButton(parent=self.centralwidget)
            self.stop_stopwatch.setGeometry(QtCore.QRect(92, 460, 76, 24))
            self.stop_stopwatch.setObjectName("stop_stopwatch")
            self.continue_stopwatch = QtWidgets.QPushButton(parent=self.centralwidget)
            self.continue_stopwatch.setGeometry(QtCore.QRect(172, 460, 76, 24))
            self.continue_stopwatch.setObjectName("continue_stopwatch")
            self.reset_stopwatch = QtWidgets.QPushButton(parent=self.centralwidget)
            self.reset_stopwatch.setGeometry(QtCore.QRect(252, 460, 76, 24))
            self.reset_stopwatch.setObjectName("reset_stopwatch")
            self.start_countdown = QtWidgets.QLabel(parent=self.centralwidget)
            self.start_countdown.setGeometry(QtCore.QRect(20, 534, 110, 16))
            self.start_countdown.setAutoFillBackground(True)
            self.start_countdown.setObjectName("start_countdown")
            self.countdown_hours = QtWidgets.QComboBox(parent=self.centralwidget)
            self.countdown_hours.setFixedWidth(45)
            self.countdown_hours.setGeometry(QtCore.QRect(130, 530, 31, 22))
            self.countdown_hours.setEditable(False)
            self.countdown_hours.setStyleSheet("QComboBox { text-align: center; }")
            self.countdown_hours.setObjectName("countdown_hours")
            self.countdown_minutes = QtWidgets.QComboBox(parent=self.centralwidget)
            self.countdown_minutes.setFixedWidth(45)
            self.countdown_minutes.setGeometry(QtCore.QRect(180, 530, 31, 22))
            self.countdown_minutes.setEditable(False)
            self.countdown_minutes.setStyleSheet("QComboBox { text-align: center; }")
            self.countdown_minutes.setObjectName("countdown_minutes")
            self.countdown_seconds = QtWidgets.QComboBox(parent=self.centralwidget)
            self.countdown_seconds.setFixedWidth(45)
            self.countdown_seconds.setGeometry(QtCore.QRect(230, 530, 31, 22))
            self.countdown_seconds.setEditable(False)
            self.countdown_seconds.setStyleSheet("QComboBox { text-align: center; }")
            self.countdown_seconds.setObjectName("countdown_seconds")
            self.countdown_milliseconds = QtWidgets.QComboBox(parent=self.centralwidget)
            self.countdown_milliseconds.setFixedWidth(50)
            self.countdown_milliseconds.setGeometry(QtCore.QRect(280, 530, 31, 22))
            self.countdown_milliseconds.setEditable(False)
            self.countdown_milliseconds.setStyleSheet("QComboBox { text-align: center; }")
            self.countdown_milliseconds.setObjectName("countdown_milliseconds")
            self.countdown = QtWidgets.QLabel(parent=self.centralwidget)
            self.countdown.setGeometry(QtCore.QRect(20, 564, 301, 41))
            font = QtGui.QFont()
            font.setPointSize(28)
            font.setBold(True)
            self.countdown.setFont(font)
            self.countdown.setAutoFillBackground(True)
            self.countdown.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
            self.countdown.setObjectName("countdown")
            self.exit_button = QtWidgets.QPushButton(parent=self.centralwidget)
            self.exit_button.setGeometry(QtCore.QRect(230, 680, 101, 31))
            font = QtGui.QFont()
            font.setPointSize(12)
            font.setBold(True)
            self.exit_button.setFont(font)
            self.exit_button.setObjectName("exit_button")
            self.countdown_start = QtWidgets.QPushButton(parent=self.centralwidget)
            self.countdown_start.setGeometry(QtCore.QRect(12, 620, 76, 24))
            self.countdown_start.setObjectName("countdown_start")
            self.countdown_stop = QtWidgets.QPushButton(parent=self.centralwidget)
            self.countdown_stop.setGeometry(QtCore.QRect(92, 620, 76, 24))
            self.countdown_stop.setObjectName("countdown_stop")
            self.countdown_continue = QtWidgets.QPushButton(parent=self.centralwidget)
            self.countdown_continue.setGeometry(QtCore.QRect(172, 620, 76, 24))
            self.countdown_continue.setObjectName("countdown_continue")
            self.countdown_reset = QtWidgets.QPushButton(parent=self.centralwidget)
            self.countdown_reset.setGeometry(QtCore.QRect(252, 620, 76, 24))
            self.countdown_reset.setObjectName("countdown_reset")
            MainWindow.setCentralWidget(self.centralwidget)
            self.menubar = QtWidgets.QMenuBar(parent=MainWindow)
            self.menubar.setGeometry(QtCore.QRect(0, 0, 341, 33))
            self.menubar.setObjectName("menubar")
            self.menuFile = QtWidgets.QMenu(parent=self.menubar)
            self.menuFile.setObjectName("menuFile")
            self.menu = QtWidgets.QMenu(parent=self.menubar)
            self.menu.setObjectName("menu")
            self.menuInfo = QtWidgets.QMenu(parent=self.menu)
            self.menuInfo.setObjectName("menuInfo")
            self.menuAbout = QtWidgets.QMenu(parent=self.menu)
            self.menuAbout.setObjectName("menuAbout")
            MainWindow.setMenuBar(self.menubar)
            self.statusbar = QtWidgets.QStatusBar(parent=MainWindow)
            self.statusbar.setObjectName("statusbar")
            MainWindow.setStatusBar(self.statusbar)
            self.actionReset = QtGui.QAction(parent=MainWindow)
            self.actionReset.setObjectName("actionReset")
            self.actionExit = QtGui.QAction(parent=MainWindow)
            self.actionExit.setObjectName("actionExit")
            self.menuFile.addAction(self.actionReset)
            self.menuFile.addAction(self.actionExit)
            self.menubar.addAction(self.menuFile.menuAction())
            self.retranslateUi(MainWindow)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
            self.menuHelp = QtWidgets.QMenu(self.menubar)
            self.menuHelp.setTitle("?")
            self.actionInfo = QtGui.QAction("Info", MainWindow)
            self.actionAbout = QtGui.QAction("About", MainWindow)
            self.menuHelp.addAction(self.actionInfo)
            self.menuHelp.addAction(self.actionAbout)
            self.menubar.addAction(self.menuHelp.menuAction())
    
        def retranslateUi(self, MainWindow):
            _translate = QtCore.QCoreApplication.translate
            MainWindow.setWindowTitle(_translate("MainWindow", "Clocking It!"))
            self.time_clock.setText(_translate("MainWindow", "00:00:00.000"))
            current_date = datetime.datetime.now().strftime("%A, %d.%m.%Y")
            self.day_and_date.setText(current_date)
            self.start_checkbox.setText(_translate("MainWindow", "Start"))
            self.stop_checkbox.setText(_translate("MainWindow", "Stop"))
            self.Checkbox_Timer.setText(_translate("MainWindow", "00:00:00.000"))
            self.manual_start_hours.setCurrentText(_translate("MainWindow", "00"))
            self.manual_start_minutes.setCurrentText(_translate("MainWindow", "00"))
            self.manual_start_seconds.setCurrentText(_translate("MainWindow", "00"))
            self.manual_start_milliseconds.setCurrentText(_translate("MainWindow", "000"))
            self.manual_start.setText(_translate("MainWindow", "Start Calculation:"))
            self.manual_end.setText(_translate("MainWindow", "End Calculation:"))
            self.manual_end_hours.setCurrentText(_translate("MainWindow", "00"))
            self.manual_end_minutes.setCurrentText(_translate("MainWindow", "00"))
            self.manual_end_seconds.setCurrentText(_translate("MainWindow", "00"))
            self.manual_end_milliseconds.setCurrentText(_translate("MainWindow", "000"))
            self.manual_calculator_button.setText(_translate("MainWindow", "Calculate Time Difference"))
            self.manual_result.setText(_translate("MainWindow", "00:00:00.000"))
            self.stopwatch.setText(_translate("MainWindow", "00:00:00.000"))
            self.start_stopwatch.setText(_translate("MainWindow", "START"))
            self.start_alarmclock.setText(_translate("MainWindow", "ON"))
            self.stop_alarmclock.setText(_translate("MainWindow", "OFF"))
            self.alarmclock.setText(_translate("MainWindow", "Set Alarm Time:"))
            self.stop_stopwatch.setText(_translate("MainWindow", "STOP"))
            self.reset_stopwatch.setText(_translate("MainWindow", "RESET"))
            self.continue_stopwatch.setText(_translate("MainWindow", "CONTINUE"))
            self.start_countdown.setText(_translate("MainWindow", "Set Countdown:"))
            self.countdown_hours.setCurrentText(_translate("MainWindow", "00"))
            self.countdown_minutes.setCurrentText(_translate("MainWindow", "00"))
            self.countdown_seconds.setCurrentText(_translate("MainWindow", "00"))
            self.countdown_milliseconds.setCurrentText(_translate("MainWindow", "000"))
            self.countdown.setText(_translate("MainWindow", "00:00:00.000"))
            self.exit_button.setText(_translate("MainWindow", "EXIT"))
            self.countdown_start.setText(_translate("MainWindow", "START"))
            self.countdown_stop.setText(_translate("MainWindow", "STOP"))
            self.countdown_continue.setText(_translate("MainWindow", "CONTINUE"))
            self.countdown_reset.setText(_translate("MainWindow", "RESET"))
            self.menuFile.setTitle(_translate("MainWindow", "File"))
            self.menu.setTitle(_translate("MainWindow", "?"))
            self.menuInfo.setTitle(_translate("MainWindow", "Info"))
            self.menuAbout.setTitle(_translate("MainWindow", "About"))
            self.actionReset.setText(_translate("MainWindow", "Reset"))
            self.actionExit.setText(_translate("MainWindow", "Exit"))
    
    base_dir = os.path.dirname(os.path.abspath(__file__))
    sound_path = os.path.join(base_dir, "alarm.wav")
    
    class TimerApp(QMainWindow):
        def __init__(self):
            super().__init__()
            self.ui = Ui_MainWindow()
            self.ui.setupUi(self)
            self.setFixedSize(self.size())  # Prevent resizing
    
            # --- Populate dropdowns for alarm clock, manual time, and countdown ---
            self.populate_comboboxes([self.ui.alarmclock_hours], 24)
            self.populate_comboboxes([self.ui.alarmclock_minutes, self.ui.alarmclock_seconds], 60)
            self.populate_comboboxes([self.ui.alarmclock_milliseconds], 1000, format_string="{:03d}")
            self.populate_comboboxes([self.ui.manual_start_hours, self.ui.manual_end_hours], 24)
            self.populate_comboboxes([self.ui.manual_start_minutes, self.ui.manual_end_minutes,
                                      self.ui.manual_start_seconds, self.ui.manual_end_seconds], 60)
            self.populate_comboboxes([self.ui.manual_start_milliseconds,
                                      self.ui.manual_end_milliseconds], 1000, format_string="{:03d}")
            self.populate_comboboxes([self.ui.countdown_hours], 24)
            self.populate_comboboxes([self.ui.countdown_minutes, self.ui.countdown_seconds], 60)
            self.populate_comboboxes([self.ui.countdown_milliseconds], 1000, format_string="{:03d}")
    
            # --- Alarm Timer ---
            self.alarm_timer = QTimer(self)
            self.alarm_timer.timeout.connect(self.check_alarm)
            self.alarm_active = False
    
            # --- Sound Effect (can be .wav only) ---
            self.alarm_sound = QSoundEffect()
            self.alarm_sound.setSource(QUrl.fromLocalFile(sound_path))
    
            # --- Connect buttons ---
            self.ui.start_alarmclock.clicked.connect(self.enable_alarm)
            self.ui.stop_alarmclock.clicked.connect(self.disable_alarm)
    
            # Connect Exit actions
            self.ui.actionExit.triggered.connect(self.close_application)
            self.ui.exit_button.clicked.connect(self.close_application)
            self.ui.actionReset.triggered.connect(self.reset_all)
    
            # Connect Help Menu actions
            self.ui.actionInfo.triggered.connect(self.show_info)
            self.ui.actionAbout.triggered.connect(self.show_about)
    
            # Setup the rest
            self.ui.manual_calculator_button.clicked.connect(self.calculate_manual_time_difference)
            self.clock_timer = QTimer(self)
            self.clock_timer.timeout.connect(self.update_time)
            self.clock_timer.start(100)
    
            self.stopwatch_timer = QTimer(self)
            self.stopwatch_timer.timeout.connect(self.update_stopwatch)
    
            self.start_time = None
            self.stop_time = None
    
            self.ui.start_checkbox.toggled.connect(self.start_timer)
            self.ui.stop_checkbox.toggled.connect(self.stop_timer)
    
            self.ui.start_stopwatch.clicked.connect(self.start_stopwatch_timer)
            self.ui.stop_stopwatch.clicked.connect(self.stop_stopwatch_timer)
            self.ui.continue_stopwatch.clicked.connect(self.continue_stopwatch_timer)
            self.ui.reset_stopwatch.clicked.connect(self.reset_stopwatch_timer)
            
            self.ui.start_alarmclock.setEnabled(True)
            self.ui.start_alarmclock.setDisabled(False)
            self.ui.stop_alarmclock.setEnabled(False)
            self.ui.stop_alarmclock.setDisabled(True)
            
            self.ui.start_stopwatch.setEnabled(True)
            self.ui.start_stopwatch.setDisabled(False)
            self.ui.stop_stopwatch.setEnabled(False)
            self.ui.stop_stopwatch.setDisabled(True)
            self.ui.continue_stopwatch.setEnabled(False)
            self.ui.continue_stopwatch.setDisabled(True)
            self.ui.reset_stopwatch.setEnabled(False)
            self.ui.reset_stopwatch.setDisabled(True)
    
            self.ui.countdown_start.clicked.connect(self.start_countdown_timer)
            self.ui.countdown_stop.clicked.connect(self.stop_countdown_timer)
            self.ui.countdown_reset.clicked.connect(self.reset_countdown_timer)
            self.ui.countdown_continue.clicked.connect(self.continue_countdown_timer)
    
            self.countdown_time = QTime(0, 0, 0, 0)
            self.countdown_remaining_time = QTime(0, 0, 0, 0)
            self.countdown_timer = QTimer(self)
            self.countdown_timer.timeout.connect(self.update_countdown)
    
            self.countdown_running = False
            self.countdown_paused = False
            self.ui.countdown_start.setEnabled(True)
            self.ui.countdown_start.setDisabled(False)
            self.ui.countdown_stop.setEnabled(False)
            self.ui.countdown_stop.setDisabled(True)
            self.ui.countdown_continue.setEnabled(False)
            self.ui.countdown_continue.setDisabled(True)
            self.ui.countdown_reset.setEnabled(False)
            self.ui.countdown_reset.setDisabled(True)
    
        def enable_alarm(self):
            if not self.alarm_active:
                self.alarm_active = True
                self.alarm_timer.start(100)  # Check every 100 ms
                QMessageBox.about(self, "Alarm Clock", "Alarm clock enabled!")
                self.ui.start_alarmclock.setEnabled(False)
                self.ui.start_alarmclock.setDisabled(True)
                self.ui.stop_alarmclock.setEnabled(True)
                self.ui.stop_alarmclock.setDisabled(False)
    
        def disable_alarm(self):
            if self.alarm_active:
                self.alarm_active = False
                self.alarm_timer.stop()
                QMessageBox.about(self, "Alarm Clock", "Alarm clock disabled!")
                self.ui.start_alarmclock.setEnabled(True)
                self.ui.start_alarmclock.setDisabled(False)
                self.ui.stop_alarmclock.setEnabled(False)
                self.ui.stop_alarmclock.setDisabled(True)
    
        def check_alarm(self):
            now = datetime.datetime.now()
            set_time = datetime.datetime(
                now.year,
                now.month,
                now.day,
                int(self.ui.alarmclock_hours.currentText()),
                int(self.ui.alarmclock_minutes.currentText()),
                int(self.ui.alarmclock_seconds.currentText()),
                int(self.ui.alarmclock_milliseconds.currentText()) * 1000  # Convert ms to microseconds
            )
    
            if now >= set_time:
                self.trigger_alarm()
    
        def trigger_alarm(self):
            self.alarm_active = False
            self.alarm_timer.stop()
    
            # Play sound
            self.alarm_sound.setLoopCount(5)  # Optional: play multiple times
            self.alarm_sound.play()
    
            # Show message
            QMessageBox.about(self, "Alarm Triggered", "The alarm time has been reached!")
    
        def reset_all(self):
            print("Full reset triggered")
    
            # === Reset all labels ===
            self.ui.time_clock.setText("00:00:00.000")
            self.ui.stopwatch.setText("00:00:00.000")
            self.ui.countdown.setText("00:00:00.000")
            self.ui.Checkbox_Timer.setText("00:00:00.00")
            self.ui.manual_result.setText("00:00:00.000")
    
            # === Stop and reset timers ===
            self.stopwatch_timer.stop()
            self.countdown_timer.stop()
    
            # === Reset internal timer states ===
            self.start_time = None
            self.stop_time = None
            self.countdown_time = QTime(0, 0, 0, 0)
            self.countdown_remaining_time = QTime(0, 0, 0, 0)
            self.countdown_running = False
            self.countdown_paused = False
    
            # === Reset checkboxes ===
            self.ui.start_checkbox.setChecked(False)
            self.ui.stop_checkbox.setChecked(False)
    
            # === Reset stopwatch buttons ===
            self.ui.start_stopwatch.setEnabled(True)
            self.ui.start_stopwatch.setDisabled(False)
            self.ui.stop_stopwatch.setEnabled(False)
            self.ui.stop_stopwatch.setDisabled(True)
            self.ui.continue_stopwatch.setEnabled(False)
            self.ui.continue_stopwatch.setDisabled(True)
            self.ui.reset_stopwatch.setEnabled(False)
            self.ui.reset_stopwatch.setDisabled(True)
    
            # === Reset countdown buttons ===
            self.ui.countdown_start.setEnabled(True)
            self.ui.countdown_start.setDisabled(False)
            self.ui.countdown_stop.setEnabled(False)
            self.ui.countdown_stop.setDisabled(True)
            self.ui.countdown_continue.setEnabled(False)
            self.ui.countdown_continue.setDisabled(True)
            self.ui.countdown_reset.setEnabled(False)
            self.ui.countdown_reset.setDisabled(True)
    
            # === Reset comboboxes to default index ===
            for box in [
                self.ui.manual_start_hours, self.ui.manual_start_minutes,
                self.ui.manual_start_seconds, self.ui.manual_start_milliseconds,
                self.ui.manual_end_hours, self.ui.manual_end_minutes,
                self.ui.manual_end_seconds, self.ui.manual_end_milliseconds,
                self.ui.countdown_hours, self.ui.countdown_minutes,
                self.ui.countdown_seconds, self.ui.countdown_milliseconds
            ]:
                box.setCurrentIndex(0)
    
            # Reset alarm clock combo boxes to "00" or "000"
            self.ui.alarmclock_hours.setCurrentText("00")
            self.ui.alarmclock_minutes.setCurrentText("00")
            self.ui.alarmclock_seconds.setCurrentText("00")
            self.ui.alarmclock_milliseconds.setCurrentText("000")
    
            # Stop alarm clock if it was running
            self.alarm_timer.stop()
            self.alarm_triggered = False
    
            print("Reset complete.")
    
        def close_application(self):
            print("Exit triggered")  # For debugging
            self.close()
    
        def update_time(self):
            current_time = datetime.datetime.now()
            formatted_time = current_time.strftime("%H:%M:%S")
            milliseconds = current_time.microsecond // 1000
            formatted_time_with_ms = f"{formatted_time}.{milliseconds:03}"
            self.ui.time_clock.setText(formatted_time_with_ms)
    
        def start_timer(self):
            if self.ui.start_checkbox.isChecked():
                self.start_time = datetime.datetime.now()
                print(f"Start time: {self.start_time}")
    
        def stop_timer(self):
            if self.ui.stop_checkbox.isChecked() and self.start_time is not None:
                self.stop_time = datetime.datetime.now()
                print(f"Stop time: {self.stop_time}")
                time_difference = self.stop_time - self.start_time
                hours, remainder = divmod(time_difference.seconds, 3600)
                minutes, seconds = divmod(remainder, 60)
                milliseconds = time_difference.microseconds // 1000
                self.ui.Checkbox_Timer.setText(f"{hours:02}:{minutes:02}:{seconds:02}.{milliseconds:03}")
        
        def populate_comboboxes(self, comboboxes, max_value, format_string="{:02d}"):
            for combobox in comboboxes:
                for i in range(max_value):
                    combobox.addItem(format_string.format(i))
    
        def calculate_manual_time_difference(self):
            start_time = QTime(
                int(self.ui.manual_start_hours.currentText()),
                int(self.ui.manual_start_minutes.currentText()),
                int(self.ui.manual_start_seconds.currentText()),
                int(self.ui.manual_start_milliseconds.currentText())
            )
            end_time = QTime(
                int(self.ui.manual_end_hours.currentText()),
                int(self.ui.manual_end_minutes.currentText()),
                int(self.ui.manual_end_seconds.currentText()),
                int(self.ui.manual_end_milliseconds.currentText())
            )
            print(f"Start Time: {start_time.toString()}")
            print(f"End Time: {end_time.toString()}")
            time_diff = start_time.msecsTo(end_time)
            hours = time_diff // (1000 * 3600)
            minutes = (time_diff % (1000 * 3600)) // (1000 * 60)
            seconds = (time_diff % (1000 * 60)) // 1000
            milliseconds = time_diff % 1000
            self.ui.manual_result.setText(f"{hours:02}:{minutes:02}:{seconds:02}.{milliseconds:03}")
    
        def start_stopwatch_timer(self):
            self.stopwatch_timer.start(10)
            self.ui.start_stopwatch.setEnabled(False)
            self.ui.start_stopwatch.setDisabled(True)
            self.ui.stop_stopwatch.setEnabled(True)
            self.ui.stop_stopwatch.setDisabled(False)
            self.ui.continue_stopwatch.setEnabled(False)
            self.ui.continue_stopwatch.setDisabled(True)
            self.ui.reset_stopwatch.setEnabled(False)
            self.ui.reset_stopwatch.setDisabled(True)
    
        def stop_stopwatch_timer(self):
            self.stopwatch_timer.stop()
            self.ui.start_stopwatch.setEnabled(False)
            self.ui.start_stopwatch.setDisabled(True)
            self.ui.stop_stopwatch.setEnabled(False)
            self.ui.stop_stopwatch.setDisabled(True)
            self.ui.continue_stopwatch.setEnabled(True)
            self.ui.continue_stopwatch.setDisabled(False)
            self.ui.reset_stopwatch.setEnabled(True)
            self.ui.reset_stopwatch.setDisabled(False)
            
        def continue_stopwatch_timer(self):
            self.stopwatch_timer.start(10)
            self.ui.start_stopwatch.setEnabled(False)
            self.ui.start_stopwatch.setDisabled(True)
            self.ui.stop_stopwatch.setEnabled(True)
            self.ui.stop_stopwatch.setDisabled(False)
            self.ui.continue_stopwatch.setEnabled(True)
            self.ui.continue_stopwatch.setDisabled(False)
            self.ui.reset_stopwatch.setEnabled(False)
            self.ui.reset_stopwatch.setDisabled(True)
    
        def reset_stopwatch_timer(self):
            self.stopwatch_timer.stop()
            self.ui.stopwatch.setText("00:00:00.000")
            self.ui.start_stopwatch.setEnabled(True)
            self.ui.start_stopwatch.setDisabled(False)
            self.ui.stop_stopwatch.setEnabled(False)
            self.ui.stop_stopwatch.setDisabled(True)
            self.ui.continue_stopwatch.setEnabled(False)
            self.ui.continue_stopwatch.setDisabled(True)
            self.ui.reset_stopwatch.setEnabled(False)
            self.ui.reset_stopwatch.setDisabled(True)
    
        def update_stopwatch(self):
            time_text = self.ui.stopwatch.text()
            current_time = QTime.fromString(time_text, "hh:mm:ss.zzz")
            new_time = current_time.addMSecs(10)
            self.ui.stopwatch.setText(new_time.toString("hh:mm:ss.zzz"))
    
        def start_countdown_timer(self):
            if self.countdown_running:
                return
            if self.countdown_time == QTime(0, 0, 0, 0):
                try:
                    hours = int(self.ui.countdown_hours.currentText())
                    minutes = int(self.ui.countdown_minutes.currentText())
                    seconds = int(self.ui.countdown_seconds.currentText())
                    milliseconds = int(self.ui.countdown_milliseconds.currentText())
                    self.countdown_time = QTime(hours, minutes, seconds, milliseconds)
                except ValueError:
                    print("Invalid values in countdown dropdowns.")
                    return
            self.countdown_remaining_time = self.countdown_time
            self.countdown_timer.start(100)
            self.countdown_running = True
            self.countdown_paused = False
            self.ui.countdown_start.setEnabled(False)
            self.ui.countdown_stop.setEnabled(True)
            self.ui.countdown_continue.setEnabled(False)
            self.ui.countdown_reset.setEnabled(True)
    
        def stop_countdown_timer(self):
            if not self.countdown_running:
                return
            self.countdown_remaining_time = self.countdown_time
            self.countdown_timer.stop()
            self.countdown_running = False
            self.countdown_paused = True
            self.ui.countdown_start.setEnabled(False)
            self.ui.countdown_stop.setEnabled(False)
            self.ui.countdown_continue.setEnabled(True)
            self.ui.countdown_reset.setEnabled(True)
    
        def reset_countdown_timer(self):
            self.countdown_timer.stop()
            self.countdown_time = QTime(0, 0, 0, 0)
            self.countdown_remaining_time = QTime(0, 0, 0, 0)
            self.countdown_running = False
            self.countdown_paused = False
            self.ui.countdown.setText("00:00:00.000")
            self.ui.countdown_start.setEnabled(True)
            self.ui.countdown_stop.setEnabled(False)
            self.ui.countdown_continue.setEnabled(False)
            self.ui.countdown_reset.setEnabled(False)
    
        def continue_countdown_timer(self):
            if not self.countdown_paused:
                return
            self.countdown_timer.start(100)
            self.countdown_running = True
            self.countdown_paused = False
            self.ui.countdown_continue.setEnabled(False)
            self.ui.countdown_stop.setEnabled(True)
    
        def update_countdown(self):
            self.countdown_remaining_time = self.countdown_remaining_time.addMSecs(-100)
            self.ui.countdown.setText(self.countdown_remaining_time.toString("hh:mm:ss.zzz"))
            if self.countdown_remaining_time == QTime(0, 0, 0, 0):
                self.countdown_timer.stop()
                self.countdown_running = False
                self.ui.countdown.setText("00:00:00.000")
                QMessageBox.about(self, "Countdown", "The countdown has finished!")
                self.ui.countdown_start.setEnabled(True)
                self.ui.countdown_stop.setEnabled(False)
                self.ui.countdown_continue.setEnabled(False)
                self.ui.countdown_reset.setEnabled(False)
                print("Countdown finished!")
                
        def show_info(self):
            msg = QMessageBox(self)
            msg.setWindowTitle("About")
            msg.setTextFormat(Qt.TextFormat.RichText)
            msg.setText("""
            <b>Clocking It!</b><br><br>
            <b>like no other clock software!<br><br>
            It's Key features include:<br>
            \u2022 Day and Date Display<br>
            \u2022 System Clock incl. Milliseconds<br>
            \u2022 Start and Stop markers to calculate time<br>
            \u2022 Manual Time Calculation (Dropdowns)<br>
            \u2022 An Alarmclock function<br>
            \u2022 A Stopwatch function<br>
            \u2022 A Countdown Timer (Stop & Contiue)<br><br>
            All built in a slim GUI with a functional<br>
            design to suit your needs. Clock On!
            """)
            msg.exec()
    
        def show_about(self):
            msg = QMessageBox(self)
            msg.setWindowTitle("About")
            msg.setTextFormat(Qt.TextFormat.RichText)
            msg.setText("""
            <b>Clocking It!</b><br><br>
            <b>Clocking It!</b>  - written using the Thonny<br>
            Editor and Python Scripting Language.<br>
            """)
            msg.exec()
    
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        window = TimerApp()
        window.show()
        sys.exit(app.exec())
    Alles anzeigen

    da hat man ggf. einen schoenen kleinen vergleich.

    gruss

    bankesbusters


    /// EDIT: fehlerkorrektur bzw. neuer python programcode mit beinhalteter fehlerkorrektur und featureerweiterung!

  • eine etwas andere uhr mit erweiterten features

    • bankesbusters
    • 7. Juni 2025 um 16:05

    hallo zusammen,

    also hier mal ein program, wie ich mir eine uhr vorstelle.

    - sie zeigt den tag, das datum und die systemuhrzeit an.
    - sie kann mit zwei checkboxen die verstrichene zeit berechnen.
    - sie kann verstrichene zeit eines manuellen zeitraums berechnen.
    - sie hat eine alarm funktion die sich an und abschalten laesst.
    - sie hat eine stoppuhr funktion welche start, stop, weiter und reset hat.
    - sie hat einen countdowntimer der start, stop, weiter und reset hat.

    was sie auch hat sind einige 'bugs' die ich gerne beheben wuerde, aber
    wenn sie nicht behoben werden koennen, dann waere das kein weltuntergang.
    manche der bugs sind wahrscheinlich nicht wirklich 'bugs' sondern eher
    kleine dinge die nicht so laufen wie ich es mir vorgestellt habe:

    1.) Beim Start wird der Tag und das Datum sehr spaet geladen.
    2.) Beim Start wird die Uhr sehr spaet geladen.
    3.) Die Befuellung der Dropdown-Boxen dauert echt (viel zu) lange.
    4.) Wenn 'File' vom Menu oder 'Help' vom Menu ausgewaehlt wird stoppt die Uhr.
    5.) Die manuelle Berechnung von Zeit dauert zu lang.
    6.) bei der checkbox messung kann man mit auch nur mit 'Stop' zeit messen.
    7.) wenn der alarm getriggert worden ist muss ich teilweise (zu) oft 'ok' klicken.
    8.) wenn countdown timer zu ende und message fenster kommt, dann haelt die uhr an.
    9.) trotz wertezuruecksetzung vom timer wird bleibt der letzte wert immer stehen.
    10.) leider kein arial vergleichbarer font

    ich habe das gleiche programm in python geschrieben und da habe ich
    allerdings keine der benannten bugs. das einzige was ich python noch
    nicht gemacht habe ist das verhalten der buttons anzupassen, welches
    hier in AutoIt gemacht worden ist, aber daran arbeite ich gerade noch.
    ich benutze in python 'font = QtGui.QFont()' der sehr nach 'arial'
    aussieht und echt schoen ist. bei bedarf oder wunsch wuerde ich den
    entsprechenden code auch von der python version posten, aber ich denke
    das wird hier nicht noetig sein?

    ich mag autoit irgendwie mehr, weil ich dort einfacher und besser eine
    GUI machen kann und bei python ist das meines erachtens nach etwas
    umstaendlicher, also ist mein wunsch in erster linie in AutoIt zu
    bleiben wenn denn moeglich.

    hier mal der stand von heute falls jemand interesse hat:

    C
    #include <ButtonConstants.au3>
    #include <ComboConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <Date.au3>
    #include <DateTimeConstants.au3>
    #include <GDIPlus.au3>
    #include <WinAPIGdi.au3>
    
    
    #Region ### START Koda GUI section ###
    Global $illclock = GUICreate("Clocking It!", 338, 791, -1, -1, -1, BitOR($WS_EX_COMPOSITED, $WS_EX_LAYERED))
    Global $MenuFile = GUICtrlCreateMenu("File")
    Global $MenuReset = GUICtrlCreateMenuItem("Reset", $MenuFile)
    Global $MenuExit = GUICtrlCreateMenuItem("Exit", $MenuFile)
    Global $MenuHelp = GUICtrlCreateMenu("Help")
    Global $MenuInfo = GUICtrlCreateMenuItem("Info", $MenuHelp)
    Global $MenuAbout = GUICtrlCreateMenuItem("About", $MenuHelp)
    Global $DayDate = GUICtrlCreateLabel("DayDate", 40, 20, 262, 33)
    Global $Clock = GUICtrlCreateLabel("Clock", 40, 66, 262, 53)
    Global $StartCheckBox = GUICtrlCreateCheckbox("Start", 16, 160, 41, 17)
    Global $StopCheckBox = GUICtrlCreateCheckbox("Stop", 288, 160, 41, 17)
    Global $Autocalculation = GUICtrlCreateLabel("00:00:00.000", 64, 152, 213, 33)
    Global $StartMCalc = GUICtrlCreateLabel("Start Calculation:", 16, 219, 84, 17)
    Global $EndMCalc = GUICtrlCreateLabel("End Calculation:", 16, 251, 81, 17)
    Global $MStartHrs= GUICtrlCreateCombo("", 104, 216, 45, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL,$WS_VSCROLL))
    Global $MStartMin = GUICtrlCreateCombo("", 160, 216, 45, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL,$WS_VSCROLL))
    Global $MStartSec = GUICtrlCreateCombo("", 216, 216, 45, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL,$WS_VSCROLL))
    Global $MStartMil = GUICtrlCreateCombo("", 272, 216, 50, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL,$WS_VSCROLL))
    Global $MEndHrs = GUICtrlCreateCombo("", 104, 248, 45, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL,$WS_VSCROLL))
    Global $MEndMin = GUICtrlCreateCombo("", 160, 248, 45, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL,$WS_VSCROLL))
    Global $MEndSec = GUICtrlCreateCombo("", 216, 248, 45, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL,$WS_VSCROLL))
    Global $MEndMil = GUICtrlCreateCombo("", 272, 248, 50, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL,$WS_VSCROLL))
    Global $MCalcGo = GUICtrlCreateButton("Calculate Time", 16, 280, 123, 33)
    Global $MCalResult = GUICtrlCreateLabel("00:00:00.000", 152, 280, 170, 33)
    Global $SetAlarm = GUICtrlCreateLabel("Set Alarm Time:", 16, 355, 86, 17)
    Global $AlarmHrs = GUICtrlCreateCombo("", 104, 352, 45, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL,$WS_VSCROLL))
    Global $AlarmMin = GUICtrlCreateCombo("", 160, 352, 45, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL,$WS_VSCROLL))
    Global $AlarmSec = GUICtrlCreateCombo("", 216, 352, 45, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL,$WS_VSCROLL))
    Global $AlarmMil = GUICtrlCreateCombo("", 272, 352, 50, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL,$WS_VSCROLL))
    Global $AlarmOn = GUICtrlCreateButton("ON", 16, 384, 147, 25)
    Global $AlarmOff = GUICtrlCreateButton("OFF", 176, 384, 147, 25)
    Global $Stopwatch = GUICtrlCreateLabel("00:00:00.000", 40, 448, 255, 33)
    Global $StopwatchStart = GUICtrlCreateButton("START", 11, 504, 75, 25)
    Global $StopwatchStop = GUICtrlCreateButton("STOP", 91, 504, 75, 25)
    Global $StopwatchCont = GUICtrlCreateButton("CONTINUE", 171, 504, 75, 25)
    Global $StopwatchReset = GUICtrlCreateButton("RESET", 251, 504, 75, 25)
    Global $SetCntdwn = GUICtrlCreateLabel("Set Countdown:", 16, 579, 80, 17)
    Global $CountHrs = GUICtrlCreateCombo("", 104, 576, 45, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL,$WS_VSCROLL))
    Global $CountMin = GUICtrlCreateCombo("", 160, 576, 45, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL,$WS_VSCROLL))
    Global $CountSec = GUICtrlCreateCombo("", 216, 576, 45, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL,$WS_VSCROLL))
    Global $CountMil = GUICtrlCreateCombo("", 272, 576, 50, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL,$WS_VSCROLL))
    Global $Countdown = GUICtrlCreateLabel("00:00:00.000", 40, 616, 250, 41)
    Global $CountStart = GUICtrlCreateButton("START", 11, 672, 75, 25)
    Global $CountStop = GUICtrlCreateButton("STOP", 91, 672, 75, 25)
    Global $CountCont = GUICtrlCreateButton("CONTINUE", 171, 672, 75, 25)
    Global $CountReset = GUICtrlCreateButton("RESET", 251, 672, 75, 25)
    Global $Exit = GUICtrlCreateButton("EXIT", 232, 720, 91, 33)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###
    
    ; #####################################################################
    ; # Other Global Values To Declare
    ; #####################################################################
    
    Global $AlarmSet = False
    Global $AlarmTargetMS = 0
    Global $hAlarmPopup = 0
    Global $bAlarmPopupVisible = False
    Global $btnAlarmOK = 0
    Global $runrunrun = 0            		; Timer handle for current running timer
    Global $elapsedBeforeStop = 0    		; Accumulated elapsed time before last stop
    Global $isRunning = False        		; Stopwatch running state
    Global $g_CountdownTotalMS = 0        	; Total countdown duration (fixed)
    Global $g_CountdownRemainingMS = 0    	; Time left when paused or running
    Global $g_CountdownStartTime = 0      	; TimerInit() timestamp for running countdown
    Global $g_CountdownRunning = False    	; True when countdown is actively running
    
    ; #####################################################################
    ; # Style Values for indivdual Parts
    ; #####################################################################
    
    GUICtrlSetFont($DayDate, 14, 600, 0, "Consolas")
    GUICtrlSetStyle($DayDate, BitOR($SS_CENTER, $SS_CENTERIMAGE))
    GUICtrlSetBkColor($DayDate, -1)
    GUICtrlSetFont($Clock, 26, 900, 0, "Consolas")
    GUICtrlSetStyle($Clock, BitOR($SS_CENTER, $SS_CENTERIMAGE))
    GUICtrlSetBkColor($Clock, -1)
    GUICtrlSetFont($Autocalculation, 20, 600, 0, "Consolas")
    GUICtrlSetStyle($Autocalculation, BitOR($SS_CENTER, $SS_CENTERIMAGE))
    GUICtrlSetBkColor($Autocalculation, -1)
    GUICtrlSetFont($MCalResult, 18, 600, 0, "Consolas")
    GUICtrlSetStyle($MCalResult, BitOR($SS_CENTER, $SS_CENTERIMAGE))
    GUICtrlSetBkColor($MCalResult, -1)
    GUICtrlSetState($AlarmOff, $GUI_DISABLE)
    GUICtrlSetFont($Stopwatch, 26, 900, 0, "Consolas")
    GUICtrlSetStyle($Stopwatch, BitOR($SS_CENTER, $SS_CENTERIMAGE))
    GUICtrlSetBkColor($Stopwatch, -1)
    GUICtrlSetState($StopwatchStart, $GUI_ENABLE)
    GUICtrlSetState($StopwatchReset, $GUI_DISABLE)
    GUICtrlSetState($StopwatchStop, $GUI_DISABLE)
    GUICtrlSetState($StopwatchCont, $GUI_DISABLE)
    GUICtrlSetFont($Countdown, 26, 900, 0, "Consolas")
    GUICtrlSetStyle($Countdown, BitOR($SS_CENTER, $SS_CENTERIMAGE))
    GUICtrlSetBkColor($Countdown, -1)
    GUICtrlSetState($CountStart, $GUI_ENABLE)
    GUICtrlSetState($CountReset, $GUI_DISABLE)
    GUICtrlSetState($CountStop, $GUI_DISABLE)
    GUICtrlSetState($CountCont, $GUI_DISABLE)
    
    ; #####################################################################
    ; # Fill Data into Dropdown Boxes
    ; #####################################################################
    
    ; Fill Dropdown: Hours
    Local $sHours = ""
    For $i = 0 To 23
        $sHours &= StringFormat("%02d", $i) & "|"
    Next
    $sHours = StringTrimRight($sHours, 1)
    GUICtrlSetData($MStartHrs, $sHours, "00")
    GUICtrlSetData($MEndHrs, $sHours, "00")
    GUICtrlSetData($AlarmHrs, $sHours, "00")
    GUICtrlSetData($CountHrs, $sHours, "00")
    
    ; Fill Dropdown: Minutes and Seconds
    Local $sMinSec = ""
    For $i = 0 To 59
        $sMinSec &= StringFormat("%02d", $i) & "|"
    Next
    $sMinSec = StringTrimRight($sMinSec, 1)
    GUICtrlSetData($MStartMin, $sMinSec, "00")
    GUICtrlSetData($MEndMin, $sMinSec, "00")
    GUICtrlSetData($AlarmMin, $sMinSec, "00")
    GUICtrlSetData($CountMin, $sMinSec, "00")
    GUICtrlSetData($MStartSec, $sMinSec, "00")
    GUICtrlSetData($MEndSec, $sMinSec, "00")
    GUICtrlSetData($AlarmSec, $sMinSec, "00")
    GUICtrlSetData($CountSec, $sMinSec, "00")
    
    ; Fill Dropdown: Milliseconds
    Local $sMillis = ""
    For $i = 0 To 999
        $sMillis &= StringFormat("%03d", $i) & "|"
    Next
    $sMillis = StringTrimRight($sMillis, 1)
    GUICtrlSetData($MStartMil, $sMillis, "000")
    GUICtrlSetData($MEndMil, $sMillis, "000")
    GUICtrlSetData($AlarmMil, $sMillis, "000")
    GUICtrlSetData($CountMil, $sMillis, "000")
    
    ; #####################################################################
    ; # Main Loop for the actual Application
    ; #####################################################################
    
    While 1
    	$nMsg = GUIGetMsg()
    
    	If $isRunning And $runrunrun <> 0 Then
    		$totalElapsed = $elapsedBeforeStop + TimerDiff($runrunrun)
    	Else
    		$totalElapsed = $elapsedBeforeStop
    	EndIf
    	GUICtrlSetData($Stopwatch, FormatTime($totalElapsed))
    
    	Local $aDays[7] = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
    	Local $dayOfWeek = _DateToDayOfWeekISO(@YEAR, @MON, @MDAY)
    	Local $dayname = $aDays[$dayOfWeek - 1]
    	; Format the date string
        Local $DateString = $dayname &  ", " & @MDAY & "." & @MON & "." & @YEAR
    	GUICtrlSetData($DayDate, $DateString)
    
    	; Update label text
    	Local $TimeString = StringFormat("%02d:%02d:%02d.%02d0", @HOUR, @MIN, @SEC, @MSEC / 10)
    	GUICtrlSetData($Clock, $TimeString)
    
    	Switch $nMsg
    		Case $GUI_EVENT_CLOSE, $Exit, $MenuExit
    			ExitLoop
    
    		Case $StartCheckBox
                If GUICtrlRead($StartCheckBox) = $GUI_CHECKED Then
                    GUICtrlSetData($StartCheckBox, 'GO')
    				$StartCBTime = TimerInit()
                Else
                    GUICtrlSetData($StartCheckBox, 'Start')
                EndIf
    
    		Case $StopCheckBox
                If GUICtrlRead($StopCheckBox) = $GUI_CHECKED Then
                    GUICtrlSetData($StopCheckBox, 'END')
    				; Calculate elapsed time in milliseconds
    				Local $elapsedMS = TimerDiff($StartCBTime)
    				GUICtrlSetData($Autocalculation, FormatTime($elapsedMS))
                Else
                    GUICtrlSetData($StopCheckBox, 'Stop')
                EndIf
    
    		Case $MCalcGo
    			_CalculateManualTime()
    
    		Case $AlarmOn
    			_SetAlarm()
    			$AlarmSet = True
                GUICtrlSetState($AlarmOn, $GUI_DISABLE)
    			GUICtrlSetState($AlarmOff, $GUI_ENABLE)
    
    		Case $AlarmOff
    			_ClearAlarm()
    			$AlarmSet = False
    			GUICtrlSetState($AlarmOff, $GUI_DISABLE)
    			GUICtrlSetState($AlarmOn, $GUI_ENABLE)
    
    		Case $StopwatchStart
                $runrunrun = TimerInit()
                $elapsedBeforeStop = 0
                $isRunning = True
    			GUICtrlSetState($StopwatchStop, $GUI_ENABLE)
    			GUICtrlSetState($StopwatchStart, $GUI_DISABLE)
    			GUICtrlSetState($StopwatchReset, $GUI_DISABLE)
    			GUICtrlSetState($StopwatchCont, $GUI_DISABLE)
    
            Case $StopwatchStop
                If $isRunning Then
                    $elapsedBeforeStop += TimerDiff($runrunrun)
                    $isRunning = False
                EndIf
    			GUICtrlSetState($StopwatchReset, $GUI_ENABLE)
    			GUICtrlSetState($StopwatchCont, $GUI_ENABLE)
    
            Case $StopwatchCont
                If Not $isRunning Then
                    $runrunrun = TimerInit()
                    $isRunning = True
                EndIf
    			GUICtrlSetState($StopwatchReset, $GUI_DISABLE)
    			GUICtrlSetState($StopwatchCont, $GUI_DISABLE)
    
            Case $StopwatchReset
    			$elapsedBeforeStop = 0
    			$isRunning = False
    			$runrunrun = 0           ; Reset timer handle
    			GUICtrlSetData($Stopwatch, "00:00:00.000")
    			GUICtrlSetState($StopwatchStart, $GUI_ENABLE)
    			GUICtrlSetState($StopwatchReset, $GUI_DISABLE)
    			GUICtrlSetState($StopwatchStop, $GUI_DISABLE)
    			GUICtrlSetState($StopwatchCont, $GUI_DISABLE)
    
    		Case $CountStart
    			_ReadyCountdownTimer() ; Sets $g_CountdownTotalMS, $g_CountdownStartTime, $g_CountdownRunning = True
    			$g_CountdownRemainingMS = $g_CountdownTotalMS
    			GUICtrlSetState($CountStop, $GUI_ENABLE)
    			GUICtrlSetState($CountStart, $GUI_DISABLE)
    			GUICtrlSetState($CountReset, $GUI_DISABLE)
    			GUICtrlSetState($CountCont, $GUI_DISABLE)
    
    
            Case $CountStop
    			; Pause countdown by calculating remaining time
    			Local $elapsedMS = TimerDiff($g_CountdownStartTime)
    			$g_CountdownRemainingMS = $g_CountdownRemainingMS - $elapsedMS
    			$g_CountdownRunning = False
    			GUICtrlSetState($CountStop, $GUI_DISABLE)
    			GUICtrlSetState($CountReset, $GUI_ENABLE)
    			GUICtrlSetState($CountCont, $GUI_ENABLE)
    
            Case $CountCont
    			; Continue countdown by restarting timer with remaining time
    			$g_CountdownStartTime = TimerInit()
    			$g_CountdownRunning = True
    			GUICtrlSetState($CountReset, $GUI_DISABLE)
    			GUICtrlSetState($CountCont, $GUI_DISABLE)
    			GUICtrlSetState($CountStop, $GUI_ENABLE)
    
            Case $CountReset
    			$g_CountdownRunning = False
    			$g_CountdownRemainingMS = 0
    			$g_CountdownTotalMS = 0
    			GUICtrlSetData($Countdown, "00:00:00.000")
    			GUICtrlSetState($CountStart, $GUI_ENABLE)
    			GUICtrlSetState($CountReset, $GUI_DISABLE)
    			GUICtrlSetState($CountStop, $GUI_DISABLE)
    			GUICtrlSetState($CountCont, $GUI_DISABLE)
    
    		Case $MenuReset
    			_AllBackToStartingPosition()
    
    	EndSwitch
    
        ; Handle alarm popup messages if visible
        If $bAlarmPopupVisible Then
            Local $popupMsg = GUIGetMsg($hAlarmPopup)
            If $popupMsg = $btnAlarmOK Or $popupMsg = $GUI_EVENT_CLOSE Then
    			_DestroyAlarmPopup()
            EndIf
        EndIf
    
        ; Alarm checking
        If $AlarmSet And Not $bAlarmPopupVisible Then
            Local $currentMS = (@HOUR * 3600000) + (@MIN * 60000) + (@SEC * 1000) + @MSEC
            If $currentMS >= $AlarmTargetMS Then
                ;SoundPlay(@ScriptDir & "\alarm.wav", 1)
                _CreateAlarmPopup()
                _ClearAlarm()
            EndIf
        EndIf
    
    	If $g_CountdownRunning Then
    		Local $elapsedMS = TimerDiff($g_CountdownStartTime)
    		Local $remainingMS = $g_CountdownRemainingMS - $elapsedMS
    
        If $remainingMS <= 0 Then
            $remainingMS = 0
            $g_CountdownRunning = False
    		GUICtrlSetData($CountHrs, $sHours, "00")
    		GUICtrlSetData($CountMin, $sMinSec, "00")
    		GUICtrlSetData($CountSec, $sMinSec, "00")
    		GUICtrlSetData($CountMil, $sMillis, "000")
    		GUICtrlSetData($Countdown, "00:00:00.000")
    		GUICtrlSetState($CountStart, $GUI_ENABLE)
    		GUICtrlSetState($CountReset, $GUI_DISABLE)
    		GUICtrlSetState($CountStop, $GUI_DISABLE)
    		GUICtrlSetState($CountCont, $GUI_DISABLE)
            _ShowAlarmPopup()
        Else
            GUICtrlSetData($Countdown, FormatTime($remainingMS))
        EndIf
    	Else
        ; Countdown paused — just show remaining time without counting down
        GUICtrlSetData($Countdown, FormatTime($g_CountdownRemainingMS))
    	EndIf
    
    	Sleep(50)
    
    WEnd
    
    ; #####################################################################
    ; # Terminate the Application
    ; #####################################################################
    
    GUIDelete()
    
    ; #####################################################################
    ; # Functions used in the Application
    ; #####################################################################
    
    Func _CalculateManualTime()
        Local $startH = Number(GUICtrlRead($MStartHrs))
        Local $startM = Number(GUICtrlRead($MStartMin))
        Local $startS = Number(GUICtrlRead($MStartSec))
        Local $startMS = Number(GUICtrlRead($MStartMil))
        Local $endH = Number(GUICtrlRead($MEndHrs))
        Local $endM = Number(GUICtrlRead($MEndMin))
        Local $endS = Number(GUICtrlRead($MEndSec))
        Local $endMS = Number(GUICtrlRead($MEndMil))
        Local $startTotalMS = ($startH * 3600000) + ($startM * 60000) + ($startS * 1000) + $startMS
        Local $endTotalMS = ($endH * 3600000) + ($endM * 60000) + ($endS * 1000) + $endMS
        Local $diffMS = $endTotalMS - $startTotalMS
        If $diffMS < 0 Then $diffMS += 24 * 3600000 ; Handle crossing midnight
    	GUICtrlSetData($MCalResult, FormatTime($diffMS))
    EndFunc
    
    Func _SetAlarm()
        Local $hrs = Number(GUICtrlRead($AlarmHrs))
        Local $min = Number(GUICtrlRead($AlarmMin))
        Local $sec = Number(GUICtrlRead($AlarmSec))
        Local $mil = Number(GUICtrlRead($AlarmMil))
        ; Convert to milliseconds for easier comparison
        $AlarmTargetMS = ($hrs * 3600000) + ($min * 60000) + ($sec * 1000) + $mil
        $AlarmSet = True
    EndFunc
    
    Func _ClearAlarm()
        $AlarmSet = False
    EndFunc
    
    Func _ShowAlarmPopup()
        ; Prevent multiple popups
        If $hAlarmPopup And WinExists($hAlarmPopup) Then Return
        ; Create the popup GUI
        $hAlarmPopup = GUICreate("Warning", 250, 120, -1, -1, $WS_POPUP + $WS_CAPTION + $WS_SYSMENU)
        GUICtrlCreateLabel("Time's UP! Please press OK.", 20, 20, 210, 40, $SS_CENTER)
        Local $btnOK = GUICtrlCreateButton("OK", 85, 70, 80, 30)
        GUISetState(@SW_SHOW, $hAlarmPopup)
        ; Handle messages for the alarm popup separately
        While 1
            Local $msg = GUIGetMsg()
            If $msg = $btnOK Or $msg = $GUI_EVENT_CLOSE Then
                GUIDelete($hAlarmPopup)
                $hAlarmPopup = 0
                ExitLoop
            EndIf
            Sleep(10) ; Let CPU breathe
        WEnd
    EndFunc
    
    Func _CreateAlarmPopup()
        $hAlarmPopup = GUICreate("Warning", 250, 120, -1, -1, $WS_POPUP + $WS_CAPTION + $WS_SYSMENU)
        GUICtrlCreateLabel("Time's UP! Please press OK.", 20, 20, 210, 40, $SS_CENTER)
        $btnAlarmOK = GUICtrlCreateButton("OK", 85, 70, 80, 30)
        GUISetState(@SW_SHOW, $hAlarmPopup)
        $bAlarmPopupVisible = True
    EndFunc ;==>_CreateAlarmPopup
    
    Func _DestroyAlarmPopup()
        GUIDelete($hAlarmPopup)
        $hAlarmPopup = 0
        $bAlarmPopupVisible = False
    EndFunc ;==>_DestroyAlarmPopup
    
    ; Format milliseconds into 00:00:00.000 string
    Func FormatTime($ms)
        Local $hours = Int($ms / 3600000)
        Local $minutes = Int(Mod($ms, 3600000) / 60000)
        Local $seconds = Int(Mod($ms, 60000) / 1000)
        Local $milliseconds = Mod($ms, 1000)
        Return StringFormat("%02d:%02d:%02d.%03d", $hours, $minutes, $seconds, $milliseconds)
    EndFunc ;==>FormatTime
    
    Func _ReadyCountdownTimer()
        Local $RCountHrs = Number(GUICtrlRead($CountHrs))
        Local $RCountMin = Number(GUICtrlRead($CountMin))
        Local $RCountSec = Number(GUICtrlRead($CountSec))
        Local $RCountMil = Number(GUICtrlRead($CountMil))
        $g_CountdownTotalMS = ($RCountHrs * 3600000) + ($RCountMin * 60000) + ($RCountSec * 1000) + $RCountMil
        $g_CountdownStartTime = TimerInit()
        $g_CountdownRunning = True
        ; Set initial display
        Local $Countvalues = StringFormat("%02d:%02d:%02d.%03d", $RCountHrs, $RCountMin, $RCountSec, $RCountMil)
        GUICtrlSetData($Countdown, $Countvalues)
    EndFunc ;==>_ReadyCountdownTimer
    
    Func _AllBackToStartingPosition()
    	_ClearAlarm()
    	$AlarmSet = False
    	GUICtrlSetState($AlarmOff, $GUI_DISABLE)
    	GUICtrlSetState($AlarmOn, $GUI_ENABLE)
    	GUICtrlSetData($StartCheckBox, 'Start')
    	GUICtrlSetData($StopCheckBox, 'Stop')
    	GUICtrlSetData($Autocalculation, "00:00:00.000")
    	GUICtrlSetData($MStartHrs, $sHours, "00")
    	GUICtrlSetData($MEndHrs, $sHours, "00")
    	GUICtrlSetData($AlarmHrs, $sHours, "00")
    	GUICtrlSetData($CountHrs, $sHours, "00")
    	GUICtrlSetData($MStartMin, $sMinSec, "00")
    	GUICtrlSetData($MEndMin, $sMinSec, "00")
    	GUICtrlSetData($AlarmMin, $sMinSec, "00")
    	GUICtrlSetData($CountMin, $sMinSec, "00")
    	GUICtrlSetData($MStartSec, $sMinSec, "00")
    	GUICtrlSetData($MEndSec, $sMinSec, "00")
    	GUICtrlSetData($AlarmSec, $sMinSec, "00")
    	GUICtrlSetData($CountSec, $sMinSec, "00")
    	GUICtrlSetData($MStartMil, $sMillis, "000")
    	GUICtrlSetData($MEndMil, $sMillis, "000")
    	GUICtrlSetData($AlarmMil, $sMillis, "000")
    	GUICtrlSetData($CountMil, $sMillis, "000")
    	GUICtrlSetState($StartCheckBox, $GUI_UNCHECKED)
    	GUICtrlSetState($StopCheckBox, $GUI_UNCHECKED)
    	GUICtrlSetData($MCalResult, "00:00:00.000")
    	$elapsedBeforeStop = 0
    	$isRunning = False
    	$runrunrun = 0
    	GUICtrlSetData($Stopwatch, "00:00:00.000")
    	GUICtrlSetState($StopwatchStart, $GUI_ENABLE)
    	GUICtrlSetState($StopwatchReset, $GUI_DISABLE)
    	GUICtrlSetState($StopwatchStop, $GUI_DISABLE)
    	GUICtrlSetState($StopwatchCont, $GUI_DISABLE)
    	$g_CountdownRunning = False
    	$g_CountdownRemainingMS = 0
    	$g_CountdownTotalMS = 0
    	GUICtrlSetData($Countdown, "00:00:00.000")
    	GUICtrlSetState($CountStart, $GUI_ENABLE)
    	GUICtrlSetState($CountReset, $GUI_DISABLE)
    	GUICtrlSetState($CountStop, $GUI_DISABLE)
    	GUICtrlSetState($CountCont, $GUI_DISABLE)
    EndFunc ;==>_AllBackToStartingPosition
    Alles anzeigen


    ich habe auch nichts gegen eine 'behebung' von bugs oder hilfestellungen.
    ich hatte die befuellung von den dropdownboxen mit arrays probiert, bin
    aber daran gescheitert. moeglicherweise liesse sich damit zeit einsparen?

    generell find ich es persoenlich dennoch toll wie es geworden ist.

    gruss

    bankesbusters

  • zeit berechnung zwischen zwei zeiten aber inklusive millisekunden

    • bankesbusters
    • 4. Juni 2025 um 14:17

    Moombas : vorhin war das beispiel von aspirinjunkie noch NICHT da. deswegen auch meine frage. das ist genau das, was ich in einem anderen beitrag bemaengelt habe: nicht einfach draufhauen ohne nachzudenken, das jenes beispiel spaeter hinzugefuegt wurde sieh man ja auch am einwand von aspirinjunkie:

    Zitat

    Edit: Mal umgesetzt was ich gerade meinte:

    trotzdem danke. ich glaube ich kann damit auf jeden fall etwas anfangen.

  • zeit berechnung zwischen zwei zeiten aber inklusive millisekunden

    • bankesbusters
    • 4. Juni 2025 um 11:08

    hi,

    okay, also ich fange mal mit den checkboxen an:

    Code
    Case $StartCheckBox
                If GUICtrlRead($StartCheckBox) = $GUI_CHECKED Then
                    GUICtrlSetData($StartCheckBox, 'Checked')
    				$StartCBTime = TimerInit()
                Else
                    GUICtrlSetData($StartCheckBox, 'Unchecked')
                EndIf
                
    [ ... more code here ... ]
    
    Case $StopCheckBox
                If GUICtrlRead($StopCheckBox) = $GUI_CHECKED Then
                    GUICtrlSetData($StopCheckBox, 'Checked')
    				$AutomaticTimeCalc = TimerDiff($StartCBTime)
    				; $AutomaticTimeCalc = StringFormat("%02d:%02d:%02d.%02d0", @HOUR, @MIN, @SEC, @MSEC) ; klappt nicht!
    				GUICtrlSetData($Autocalculation, $AutomaticTimeCalc)
                Else
                    GUICtrlSetData($StopCheckBox, 'Unchecked')
                EndIf
    Alles anzeigen

    also: mit dieser zeile $AutomaticTimeCalc = StringFormat("%02d:%02d:%02d.%02d0", @HOUR, @MIN, @SEC, @MSEC) bekomme ich zwar eine korrekt formatierte zahlenangabe aber keine berechnungen die richtig oder brauchbar sind. ... also testweise 3 sekunden laufen lassen zwischen checkbox start aktivieren und checkbox stop aktivieren ... ergebnis dann:

    11:07:02.310 (das war die startzeit und keine berechnung zwischen den zwei zeiten)

    mit der anderen zeile GUICtrlSetData($Autocalculation, $AutomaticTimeCalc) bekomme ich ein ergebnis wie zum beispiel dieses: 4958.9203 welches ja falsch ist. es sollte in etwa so aussehen:

    00:00:04.203

    was ubersehe ich da?

  • zeit berechnung zwischen zwei zeiten aber inklusive millisekunden

    • bankesbusters
    • 4. Juni 2025 um 09:51

    hallo zusammen,

    ich hatte diesen thread hier gesehen: AutoIt.de Thread und als ich dazu noch eine frage stellen wollte, wurde ich mit diesen worten begruesst:

    Zitat

    Die letzte Antwort auf dieses Thema liegt mehr als 365 Tage zurück. Das Thema ist womöglich bereits veraltet. Bitte erstelle ggf. ein neues Thema.

    also gut, dann erstelle ich eben ein neues thema dazu:

    ich bastel an einem script wo ich zwei mal eine zeitberechnung benoetige. zum einen habe ich eine checkbox wo ich einen anfangspunkt setzen moechte und eine zweite checkbox wo ich einen endpunkt setzen moechte und dann soll in einem label die zeitdifferenz hierzu ausgegeben werden. allerdings inklusive millisekunden!

    die zweite stelle im script macht quasi das selbe, aber man hat dropdowns fuer stunden, minuten, sekunden und millisekunden als start zeit und das selbe nochmals als endzeit.

    jetzt geht es um die berechnung der differenz zwischen den zeiten. so wie ich erkennen kann bieten mir die meisten funktionen nur eine berechnung von bis zu sekunden an, aber nicht fuer den millisekunden bereich. kann mich da einer ggf. in die richtige richtung lenken?

    _Now() und _NowTime() und auch _NowCalc() bieten mir alle nur bis sekunden an aber eben keine millisekunden.

    gibt es da noch sinnige alternativen zu?

    gruss

  • das problem mit der maus und der minimierung

    • bankesbusters
    • 3. Juni 2025 um 05:58

    auf meinem rechner habe ich die admin rechte, auf dem betriebsrechner habe ich auch die admin rechte. es geht auch nicht um die admin rechte. natuerlich habt ihr recht, wenn ihr alle sagt, dass es wahrscheinlich einfacher geht, aber mein ansatz sieht dabei noch nett aus, mit einer simplen kleinen GUI, die den mauszeiger mitnimmt und immer im vorgegebenen feld laufen laesst. da koennte man bestimmt noch erweiterungen schreiben, dass der mauszeiger gleichzeitig auch noch kleine bilder in das feld durch die bewegung 'malt'. sprich man denkt sich bewegungen aus, die zum beispiel ein haus, ein fahrrad, oder oder oder ergeben und laesst diese dann 'malen' und nach einem random prinzip abrufen. es soll ein nettes kleines (spassiges) tool sein.

    es muss nicht immer alles nach der simpelsten methode arbeiten. manchmal moechte man auch einfach nur etwas nettes machen was auch noch einen lustigen kleinen nebeneffekt hat. letztlich geht es zwar darum ein 'ich bin immer noch da' zu simulieren, aber auf eine nette art und weise.

    ich finde die anderen varianten auch sehr interessant und finde es auch nett, dass ihr euch zusaetzlich gedanken macht und weiss das sehr zu schaetzen. dadurch kann ich noch etwas lernen, was nie schaden kann. danke dafuer!

    bei diesem projekt ging es aber um die kontrolle von der maus in bezug auf die GUI (sprich das mausfeld in der gui) und dem wunsch das die maus im mausfeld ihre runden zieht, ganz gleich wo die GUI ist und dem wunsch das wenn ich die gui nach ganz rechts, oder links, oder oben, oder unten verschiebe, dass die maus in der zuletzt bekannten position einfach trotz einer minimierung weiterlaeuft. so stoert die GUI nicht, aber man erkennt, dass das program noch laeuft. ... wie gesagt, man koennte da dann noch bestimmt im mausfeld tolle dinge machen um das ganze dann noch auf eine weise mit mehr als nur eine stumpfsinnige bewegung zu befuellen.

    also nicht immer verbal mit der kelle zuschlagen, nur weil man nicht genau weiss was der sinn dahinter ist.

  • autoit vs python - die systemuhr und fragen dazu

    • bankesbusters
    • 2. Juni 2025 um 09:00

    wow. das ist ja der hammer. das sieht ja jetzt megafluessig und richtig aus. ganz wie in python. das gefaellt mir. ich hatte eine uhr mit bonusfunktionen geschrieben my python und wollte diese in autoit umsetzen bis ich das flackern sah und dachte: 'das ist nicht gut so'. ich hatte dann noch jemand gefragt der mir etwas von GDI+ erzaehlt hat und das war mir dann zu kompliziert. ich hatte die idee dann schon wieder ueber board geworfen um die uhr von python in autoit zu uebersetzen, aber mit deinem beitrag schoepfe ich gerade neue hoffnung. toll. vielen dank!

  • das problem mit der maus und der minimierung

    • bankesbusters
    • 2. Juni 2025 um 05:47

    hallo,

    das ist ja 'einfach' ich habe echt bestimmt 4 stunden experimentiert und bin nicht darauf gekommen. letztlich habt ihr beide argumentum und Schnuffel einen fast identischen code bzw. loesungsansatz unabhaengig von einander gehabt.

    Code
    If Not BitAND($iState, $WIN_STATE_MINIMIZED) Then
    	$windowPos = WinGetPos($Window)
    		If @error Then Return
    EndIf
    Local $windowX = $windowPos[0]
    Local $windowY = $windowPos[1]

    und

    Code
    If Not BitAND(WinGetState($Window), 16) Then
    	$windowX = WinGetPos($Window)[0]
    	$windowY = WinGetPos($Window)[1]

    ich waere glaube ich nie im leben darauf gekommen BitAND zu verwenden und wenn ich ehrlich bin, hatte ich vorher noch nie mit BitAND zu tun. echt toll wie einfach manchmal doch eine loesung ist. ich hatte es mit einer zweiten nachtraeglichen funktion versucht, aber alles schlug fehl und das endergebnis war immer das selbe. mauszeiger bei minimierung obere linke ecke und das war es. coole sache. ich danke euch zweien fuer die hilfe. das ist toll fuer einen betriebsrechner, der dann in der pause auf einen sperrbildschirmschoner wechselt bei dem man sich jedes mal wieder einloggen muss, denn so wird einfach die maus genug bewegt um einen wechsel in den sprerrbildschirmschoner verhindert mit ganz einfachen mitteln.

    danke vielmals

    gruss

    bankesbusters

  • autoit vs python - die systemuhr und fragen dazu

    • bankesbusters
    • 1. Juni 2025 um 19:21

    hallo zusammen,

    ich habe ein wenig in python experimentiert und mir viel dabei etwas auf wenn ich das gleiche in autoit umsetze. hier mal das python script:

    Python
    import tkinter as tk
    from datetime import datetime
    
    class ClockApp:
        def __init__(self):
            # Create main window
            self.root = tk.Tk()
            self.root.title("System Clock")
            
            # Create and configure the time label
            self.time_label = tk.Label(
                self.root,
                font=('Arial', 30, 'bold'),
                bg='black',
                fg='green'
            )
            self.time_label.pack(padx=20, pady=20)
            
            # Start the clock
            self.update_time()
        
        def update_time(self):
            # Get current time with milliseconds
            now = datetime.now()
            # Convert microseconds to milliseconds (divide by 1000) and limit to 3 digits
            milliseconds = now.microsecond // 1000
            time_str = f"{now.strftime('%H:%M:%S')}.{milliseconds:03d}"
            self.time_label.config(text=time_str)
            
            # Schedule next update (every 10ms for smooth millisecond updates)
            self.root.after(10, self.update_time)
        
        def run(self):
            self.root.mainloop()
    
    # Create and run the application
    if __name__ == "__main__":
        app = ClockApp()
        app.run()
    Alles anzeigen


    und hier mal zum vergleich das selbe script in autoit:

    C
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    
    ; Define colors explicitly
    Local $COLOR_BLACK = 0x000000
    Local $COLOR_GREEN = 0x00FF00
    
    ; Create main window
    $window = GUICreate("System Clock", 350, 150)
    GUISetBkColor($COLOR_BLACK)
    
    ; Create label for time display
    $label = GUICtrlCreateLabel("", 50, 40, 250, 60)
    GUICtrlSetFont($label, 30, 800, 0, "Arial")
    GUICtrlSetColor($label, $COLOR_GREEN)
    
    ; Show window
    GUISetState(@SW_SHOW)
    
    ; Initialize counter
    Local $counter = 0
    
    ; Main loop
    While 1
        ; Increment counter (increases by 10 each iteration due to Sleep(10))
        $counter += 10
    
        ; Get current time
        $time = @HOUR & ":" & @MIN & ":" & @SEC
    
        ; Format milliseconds (will cycle through 000-990)
        Local $milliseconds = Mod($counter, 1000)
        $milliseconds = StringFormat("%03d", $milliseconds)
    
        ; Update label text
        GUICtrlSetData($label, $time & "." & $milliseconds)
    
        ; Check for window close
        If GUIGetMsg() = $GUI_EVENT_CLOSE Then ExitLoop
    
        ; Sleep to prevent high CPU usage
        Sleep(10)
    WEnd
    
    ; Exit program
    Exit
    Alles anzeigen

    meine frage ist jetzt folgende: in python laeuft alles fluessig und schoen. in auto it flackert das immer so. warum ist das so und kann man das flackern beheben?

    gruss

    bankesbusters

  • das problem mit der maus und der minimierung

    • bankesbusters
    • 31. Mai 2025 um 21:10

    hallo,

    natuerlich funktioniert das program und tut genau was es soll:

    1) checkbox aktiviert und die maus bzw. der mauszeiger bewegt sich im vorgegebenen feld ... soweit so gut.

    2) bewegt man das programfenster an eine andere stelle waehrend es laeuft bewegt sich mauszeiger beim naechsten interval wieder im vorgegebenen feld ... soweit so gut.

    3) minimiere ich das program, dann springt der mauszeiger (bei mir) beim naechsten interval an die obere linke ecke meines bildschirms und bleibt da ... nicht so gut. = problem!

    wie gesagt. eigentlich moechte ich wenn das program laeuft, dass es im minimierten zustand an der zuletzt bekannten stelle wo sich das fenster befand weiter im interval sich bewegt. daran scheitere ich nach zahlreichen verschiedenen versuchen.

    praktischer nutzen? - damit der bildschirmschoner nicht angeht nach inaktivitaet von zeitraum 'x' oder oder oder ... letztenendes ist es einfach nur ein test und eine spielerei.

    gruss

    bankesbusters

  • das problem mit der maus und der minimierung

    • bankesbusters
    • 30. Mai 2025 um 19:10

    hallo zusammen,

    ein kleines Testprogramm um die Maus vordefiniert zu bewegen innerhalb eines festgelegten raums in der GUI. Es funktioniert so, dass wenn die Checkbox gecheckt wird, dann beginnt der Mauszeiger den vorgegebenen lauf. Dies kann dann unabhängig von dem Ort wo das Fenster ist gemacht werden und der Positionsablauf ist immer identisch. Super!

    AutoIt
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <Misc.au3>
    
    Global $Window = GUICreate("mouse - mouseing it!", 305, 185, -1, -1)
    Global $File = GUICtrlCreateMenu("File")
    Global $StartFile = GUICtrlCreateMenuItem("Start Mouse", $File)
    Global $StopFile = GUICtrlCreateMenuItem("Stop Mouse", $File)
    Global $ExitFile = GUICtrlCreateMenuItem("Exit Mouse", $File)
    Global $Help = GUICtrlCreateMenu("Help")
    Global $Info = GUICtrlCreateMenuItem("Infobox", $Help)
    Global $About = GUICtrlCreateMenuItem("About", $Help)
    Global $Mousefield = GUICtrlCreateGroup("Mousefield", 128, 16, 161, 121)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    Global $StartCheck = GUICtrlCreateCheckbox("Start Mouse", 24, 32, 81, 17)
    Global $Stop = GUICtrlCreateButton("Reset/Stop", 16, 80, 95, 25)
    Global $ExitBut = GUICtrlCreateButton("EXIT", 16, 112, 95, 25)
    GUISetState(@SW_SHOW)
    
    Global $dancing = False
    Global $step = 0
    Global $positions[4][2] = [[15, 15], [118, 15], [118, 90], [15, 90]] ; Relative Positionen in der GUI
    Global $lastMoveTime = TimerInit()
    
    While 1
        $nMsg = GUIGetMsg()
    
        Switch $nMsg
            Case $GUI_EVENT_CLOSE, $ExitBut, $ExitFile
                Exit
    
            Case $StartCheck
                If GUICtrlRead($StartCheck) = 1 Then
                    $dancing = True
                    $step = 0 ; Reset dance
                    $lastMoveTime = TimerInit()
                EndIf
    
    		Case $StartFile
    			GUICtrlSetState($StartCheck, $GUI_CHECKED)
    			If GUICtrlRead($StartCheck) = 1 Then
                    $dancing = True
                    $step = 0 ; Reset dance
                    $lastMoveTime = TimerInit()
                EndIf
    
            Case $Stop, $StopFile
                $dancing = False
                GUICtrlSetState($StartCheck, $GUI_UNCHECKED)
    
    
        EndSwitch
    
        ; Aktiviere die tanzende Maus nur wenn Checkbox gecheckt ist
        If $dancing Then
            If TimerDiff($lastMoveTime) > 5000 Then
                ; Hole Koordianten vom der linken oberen Ecke des GUI-Fensters
                Local $windowPos = WinGetPos($Window)
                Local $windowX = $windowPos[0]
                Local $windowY = $windowPos[1]
    
                ; Definiere die Bewegungsposition innerhalb des Fensters(Mousefield)
                Local $fieldX = 140  ; X position relativ zum GUI-Fenster
                Local $fieldY = 65    ; Y position relativ zum GUI-Fenster
                Local $fieldWidth = 161  ; Breite von Mousefield
                Local $fieldHeight = 121  ; Hoehe of Mousefield
    
                ; Berechne nun die neue Positionen
                Local $xPos = $positions[$step][0] + $fieldX + $windowX
                Local $yPos = $positions[$step][1] + $fieldY + $windowY
    
                ; Stelle sicher das die relative Abhaengigkeit gewaehrleistet bleibt.
                If $xPos < $windowX + $fieldX Then $xPos = $windowX + $fieldX
                If $yPos < $windowY + $fieldY Then $yPos = $windowY + $fieldY
                If $xPos > $windowX + $fieldX + $fieldWidth Then $xPos = $windowX + $fieldX + $fieldWidth
                If $yPos > $windowY + $fieldY + $fieldHeight Then $yPos = $windowY + $fieldY + $fieldHeight
    
                ; Setze den Mauszeiger an die berechnete Stelle
                MouseMove($xPos, $yPos, 10)
    
                $step += 1
                If $step >= UBound($positions) Then $step = 0
                $lastMoveTime = TimerInit()
            EndIf
        EndIf
    WEnd
    Alles anzeigen

    leider ist dies nur solange gut, wie das fenster nicht minimiert wird. wird es minimiert, dann spingt der mauszeiger beim naechsten intervall an die linke obere ecke des bildschirms und bleibt dort ohne weiterhin seinen bewegungsablauf zu machen. ... was ich machen moechte: wenn ich das fenster bewege wird ja immer relativ zu der oberen linken ecke der GUI der abstand fuer den ablauf so berechnet, dass die relative position immer die gleiche ist zu der stelle wo sich die GUI befindet. ... nun wenn ich das program starte, dann bewege und dann minimiere moechte ich im prinzip, dass der mauszeiger an der stelle wo das fenster zuletzt war einfach weitermacht trotz minimiertem status. solange bis ich das GUI-fenster wieder hervorrufe um es zu stoppen oder zu schliessen. geht das?

    ein ansatz den ich versucht hatte, war mit einer funktion, aber die lief leider ins leere. hat vielleicht jemand eine zuendende idee hierzu?

    gruss und dank im voraus

  • Einzelne Daten (Mengenproblem) in einem String durch array austauschen?

    • bankesbusters
    • 27. Mai 2025 um 18:17

    als array ging das auch noch ein wenig einfacher:

    AutoIt
    Global $input = "hello this is a great text & experiment! zzz (@yeah) * a star is a good thing & nice to see."
    Global $output = ""
    
    ; Build a map as a 1D array [a,h,b,i,...]
    Global $map[80] = [ _
        "a","m", "b","n", "c","o", "d","p", "e","q", "f","r", "g","s", "h","t", _
        "i","u", "j","v", "k","w", "l","x", "m","y", "n","z", "o","a", "p","b", _
        "q","c", "r","d", "s","e", "t","f", "u","g", "v","h", "w","i", "x","j", _
        "y","k", "z","l", "!","1", "&","2", "(","3", ")","4", "@","5", "*","6", ".","#" _
    ]
    
    ; Loop through each character
    For $i = 1 To StringLen($input)
        Local $char = StringMid($input, $i, 1)
        Local $replaced = False
        For $j = 0 To UBound($map) - 1 Step 2
            If $char = $map[$j] Then
                $output &= $map[$j + 1]
                $replaced = True
                ExitLoop
            EndIf
        Next
        If Not $replaced Then $output &= $char ; Leave unchanged
    Next
    
    MsgBox(0, "Translated", $output)
    Alles anzeigen
  • Einzelne Daten (Mengenproblem) in einem String durch array austauschen?

    • bankesbusters
    • 27. Mai 2025 um 18:15

    hi,

    ich muss das hier nochmal zeigen. mein erster versuch vom austauschen von einzelnen buchstaben in einem string war recht erfolglos bis da dann der umweg ueber ein array zunaechst als gute einfache loesung praesentiert worden ist. nun kam irgendwann noch die idee des escapen ins spiel und nach vielen vielen stunden experimentieren kann ich jetzt einige alternativen praesentieren:

    also von einem string einzelne buchstaben austauschen ohne einen escaper in einem durchlauf geht:

    AutoIt
    Global $input = "hello this is a great text & experiment! zzz (@yeah) * a star is a good thing & nice to see."
    Global $output = ""
    
    ; Source and target character maps (1-to-1 mapping)
    Global $sFrom = "abcdefghijklmnopqrstuvwxyz!&()@*. "
    Global $sTo   = "mnopqrstuvwxyzabcdefghijkl123456#_"
    
    ; Check lengths match
    If StringLen($sFrom) <> StringLen($sTo) Then
        MsgBox(16, "Error", "Mapping strings must be the same length!")
        Exit
    EndIf
    
    ; Translate character by character
    For $i = 1 To StringLen($input)
        Local $char = StringMid($input, $i, 1)
        Local $pos = StringInStr($sFrom, $char)
        If $pos > 0 Then
            $output &= StringMid($sTo, $pos, 1)
        Else
            $output &= $char ; leave unchanged
        EndIf
    Next
    
    MsgBox(0, "Translated", $output)
    Alles anzeigen


    diese loesung fand ich auch sehr elegant. ich wollte es nur mal so in den raum werfen.

    gruss

    bankesbusters

  • array(s) nach daten durchsuchen und zuordnen und damit dann ein neues array anlegen

    • bankesbusters
    • 3. Mai 2025 um 14:38

    hi,

    vorab:

    ich habe mit dieser frage von dir Schnuffel leider keine guten erfahrungen gemacht, denn danach hatte man leider kein interesse mehr mir zu helfen. ... deswegen versuche ich auch kleine probleme als fragen zu stellen um mir dann selbst mit teilstuecken weiterhelfen zu koennen. leider zeigt meine erfahrung, dass wenn man erst einmal weiss wie aufwendig etwas sein wird, dann hat man keine lust sich damit auseinanderzusetzen. (wobei dein hackathon war schon eine tolle sache und die beteiligung war auch beeindruckend!)

    eigentliche antwort:

    ich weiss jetzt nicht genau das relevant ist, aber es gibt mehrere dinge an den ich 'arbeite' die ALLE auf diesem schema bzw. diesem 'nachschlagewerk/system' beruhen:

    1. z.B.: ein weichenstellungs-nachschlage-script fuer xxl-modellzugbahn. also mir ist bekannt wo weiche ist und mir ist bekannt wo das signal dafuer ist, nun muss ich aber wissen welche spur betroffen ist, wenn ich die weiche oder das signal umstelle. (mir ist bekannt, dass es extra software fuer so etwas gibt, aber lass mal jemand an so etwas ran, der keine ahnung hat, dann ist nicht gut. ... also ein script um basics zu lernen ohne etwas kaputt zu machen)

    2. z.B.: ein spiel welches ein wenig zwischen dame, schach, ludo, halma und stratego liegt bei dem zwei oder vier spieler den zug von einem spieler teilbestimmen. also spieler 1 zieht die x-achse und spieler 2 zieht die y-achse und dort muss die spielfigur von spieler 1 hinbewegt/abgestellt werden. (das spiel gibt es nicht zu kaufen noch gibt es das generell irgendwo, es ist von mir und ich moechte das konzept von papier zum testen als script umsetzen)

    3. z.B.: ein ampelstellungs-nachschlage-script. was fuer einen einfluss hat es wenn ampel a-auf rot geht und ampel-b auf grün, wo wird dann eine andere ampel auf gelb

    4. z.B.: ein 'word-jumble' automatisions script. siehe meine fragen zu dem thema 12x12-magic-square-grid-system ... also zwecks erstellung von raetseln von einfacher bis komplexer natur mithilfe von auto-it und einem entsprechendes script.

    5. z.B.: ggf. kleine rätsel die man für einen 'escape-room' verwenden koennte also wie einen 'ceasar-cypher'. siehe umwandlung von einzelnen buchstaben in einem string.

    6. z.B.: ein kleines register zum nachschlagen von telefonnummern, adressen/e-mails und personen auf meinem rechner. besser und schneller als excel tabellen immer neu nach kreterien zu sortieren.

    7. z.B.: einfach nur der schlichte spass an der freude auto-it besser zu lernen durch praktische beispiele. hier denkt man sich dann ein problem aus und versucht es mit auto-it zu meistern. klingt bloed, aber am ende kann es ggf. irgendwann mal zu etwas nutze sein.

    ich glaube ich koennte noch viele dinge aufzaehlen, die ich auf papier (mit excel) super toll machen kann, aber der zeitaufwand emens ist und jedes individuell erstellt werden muss, waehrend ich zum beispiel mit auto-it eine möglichkeit haette einfach nur parameter zu aendern um bereits ein ganz neues ergebnis zu haben.

    ---

    fest steht, dass zu 99% meiner vorhaben es zwei bedingungen gibt um eine dritte bedingung zu ermitteln, anhand von vordefinierten suchkreterien. wichtig ist mir nur, dass es bidirektional ist. das heisst, ich muss immer davon ausgehen, dass ich nur zwei bedingungen habe um die dritte zu ermitteln dabei ist es ganz gleich welche der zwei bedingungen ich habe. deswegen habe ich immer eine komplettloesung erstellt als 'nachschlagewerk' oder 'nachschlageregister'. ich möchte also quasi immer zwei einzelne userdatensaetze haben um diese mit dem register zu vergleichen um eine entsprechende loesung zu 'ermitteln' oder 'auszugeben'

    ---

    eigentlich ganz simple.

    gruss

    bankesbusters

  • array(s) nach daten durchsuchen und zuordnen und damit dann ein neues array anlegen

    • bankesbusters
    • 3. Mai 2025 um 12:42

    hallo nochmals,

    also das thema ist doch noch nicht abgeschlossen, denn mir kamen bei meinen ganzen tests noch weitere problematiken auf. die map funktionert bei mir zumindest nur in eine richtung und nicht in jede richtung. sprich ich kann die korrekte zuweisung erreichen, wenn ich mich an die reihenfolge der daten halte. aendere ich die datenreihenfolge (der eingabe), so kann es gar dazu kommen, dass kein output erzeugt wird. (aber das ist bestimmt loesbar und ist nur eine frage der ergbniszuweisung)

    ---

    viel schlimmer ist das zweite problem: manche datensaetze sind 'fast' identisch. ich fuege die entsprechende ini-datei hier (weiter unten) als code bei. es gibt 81 eintraege und bei der erzeugung der datensatzkombinationen (hier jetzt mal farben) klappt alles genau wie es soll. aber: habe ich nur farben und EINEN datensatz bekomme ich den zweiten datensatz nicht mehr heraus, welches denke ich an doppelten (auch so gewollten) eintraegen liegt. sprich:

    Code
    rot + C = G (key81) ; rot  + C = F (key54) ;  rot + C = C (key09)

    das ist eigentlich ein problem, welches ich mittels einer idee beseitigen moechte:

    da es ja zu allen moeglichkeiten immer drei (oder im seltensten fall auch mehr) moegliche loesungen gibt, moechte ich alle drei ausgeben (alle exakt in der eingegebenen reihenfolge, aber quasi als drei verschiedene arrays die jeweils eine der drei loesungen darstellen)

    legt man diese nun untereinander ergibt sich nach sichtkontrolle die richtige loesung auf anhieb. mal ist ein richtiges element in loesungsarray1 dann in loesungsarray2 oder in loesungsarray3 aber da die einzelnen loesungen alle exakt an der selben position liegen, kann man sehen was offensichtlich richtig oder falsch ist, bsp.:

    Code
    [ loesungsarray1 ]
    [ Pos 1 ] [ Pos 2 ] [ Pos 3 ] [ Pos 4 ] [ Pos 5 ]
      H (r)     B (f)     C (f)     L (r)     E (f)
    [ loesungsarray2 ]
    [ Pos 1 ] [ Pos 2 ] [ Pos 3 ] [ Pos 4 ] [ Pos 5 ]
      A (f)     A (r)     C (f)     D (f)     O (r)
    [ loesungsarray3 ]
    [ Pos 1 ] [ Pos 2 ] [ Pos 3 ] [ Pos 4 ] [ Pos 5 ]
      A (f)     B (f)     L (t)     C (f)     D (f)
    (r) = richtig // (f) = falsch

    es ist zwar sogesehen aufwendig jetzt zu erkennen was aus welchem array richtig oder falsch ist, da die in klammern stehenden richtig oder falsch angaben ja nicht wirklich vorhanden sind und dargestellt werden, aber schaue ich mir das lange genug an, komme ich wohl drauf, dass da das wort "HALLO" in der richtigen reihenfolge steht und zu finden ist. alle anderen variationen ergeben absolut keinen sinn. (spinnt man das nun erheblich viel weiter, dann koennte man mittels einer "K.I." ermitteln lassen ob irgendwelche kombinationen einen sinn ergeben zum beispiel worte ergeben, und nur diese ausgeben)


    na ja, wer zeit und lust hat kann sich das problem ja mal angucken, ich habe es mal entsprechend kommentiert:


    zuerst die ini datei (81cube.ini):

    Code
    [Data]
    Key01=A.A.rot
    Key02=A.B.gruen
    Key03=A.C.gelb
    Key04=B.A.gelb
    Key05=B.B.rot
    Key06=B.C.gruen
    Key07=C.A.gruen
    Key08=C.B.gelb
    Key09=C.C.rot
    Key10=A.D.rot
    Key11=A.E.gelb
    Key12=A.F.gruen
    Key13=B.D.gruen
    Key14=B.E.rot
    Key15=B.F.gelb
    Key16=C.D.gelb
    Key17=C.E.gruen
    Key18=C.F.rot
    Key19=A.I.rot
    Key20=A.H.gruen
    Key21=A.G.gelb
    Key22=B.I.gelb
    Key23=B.H.rot
    Key24=B.G.gruen
    Key25=C.I.gruen
    Key26=C.H.gelb
    Key27=C.G.rot
    Key28=D.I.rot
    Key29=D.H.gruen
    Key30=D.G.gelb
    Key31=E.I.gelb
    Key32=E.H.rot
    Key33=E.G.gruen
    Key34=F.I.gruen
    Key35=F.H.gelb
    Key36=F.G.rot
    Key37=D.D.gelb
    Key38=D.E.rot
    Key39=D.F.gruen
    Key40=E.D.gruen
    Key41=E.E.gruen
    Key42=E.F.gelb
    Key43=F.D.rot
    Key44=F.E.rot
    Key45=F.F.rot
    Key46=D.A.rot
    Key47=D.B.gruen
    Key48=D.C.gelb
    Key49=E.A.gelb
    Key50=E.B.rot
    Key51=E.C.gruen
    Key52=F.A.gruen
    Key53=F.B.gelb
    Key54=F.C.rot
    Key55=I.I.gruen
    Key56=I.H.rot
    Key57=I.G.gelb
    Key58=H.I.gelb
    Key59=H.H.gelb
    Key60=H.G.gruen
    Key61=G.I.rot
    Key62=G.H.rot
    Key63=G.G.rot
    Key64=I.D.rot
    Key65=I.E.gelb
    Key66=I.F.gruen
    Key67=H.D.gruen
    Key68=H.E.rot
    Key69=H.F.gelb
    Key70=G.D.gelb
    Key71=G.E.gruen
    Key72=G.F.rot
    Key73=I.A.rot
    Key74=I.B.gelb
    Key75=I.C.gruen
    Key76=H.A.gruen
    Key77=H.B.rot
    Key78=H.C.gelb
    Key79=G.A.gelb
    Key80=G.B.gruen
    Key81=G.C.rot
    Alles anzeigen

    jetzt der nur ganz leicht modifizierte code von Kanashius :

    Code
    #include <Array.au3>
    
    ; #1 folgende zwei zeilen waren um einfach mal zu ermitteln ob bei unterschiedlichen reihenfolgen auch unterschiedliche werte gefunden werden
    ;Global $month = "A A B B C C D D E E F F G G H H I I" ; 1. Zeile Usereingabe ; diese zeile bleibt mehr oder weniger immer gleich, aber usereingabe
    ;Global $names = "A B C D E F G H I A B C D E F G H I" ; 2. Zeile Usereingabe - wichtige zeile
    ; #2 folgende zwei zeilen ist das was ich machen moechte und die ausgabe stimmt genau wie ich es mir wuensche
    Global $month = "A B C D E F G H I A B C D E F G H I" ; 2. Zeile Usereingabe - wichtige zeile
    Global $names = "A A B B C C D D E E F F G G H H I I" ; 1. Zeile Usereingabe ; diese zeile bleibt mehr oder weniger immer gleich, aber usereingabe
    ; #3 folgende zwei zeilen sind nun die loesung in verbindung mit einem der anderen datensaetze um den entsprechenden datensatz zu finden
    ;Global $month = "rot gruen gruen gruen gruen rot gelb gruen gelb gelb gelb rot gelb gruen gelb gruen rot gruen" ; 2. Zeile Usereingabe - wichtige zeile
    ;Global $names = "A A B B C C D D E E F F G G H H I I" ; 1. Zeile Usereingabe ; diese zeile bleibt mehr oder weniger immer gleich, aber usereingabe
    _example2()
    Func _example2()
       Local $mData = _readIniToMap("81cube.ini", "Data")
       Local $sMonth = $month
       Local $sNames = $names
       Local $arMonth = StringSplit($sMonth, " ", BitOR(1, 2))
       Local $arNames = StringSplit($sNames, " ", BitOR(1, 2))
       _ArrayDisplay($arMonth, "Month") ; anzeigen nur zu test zwecken vorab bei monaten
       _ArrayDisplay($arNames, "Names") ; anzeigen nur zu test zwecken vorab bei namen
       Local $arResult[UBound($arMonth)][3]
       For $i=0 To UBound($arMonth)-1 Step 1
           $arResult[$i][0] = $arNames[$i] ; <<<<<<<<<<<<< ========== wird eigentlich nicht benoetigt fuer die ausgabe
           $arResult[$i][1] = $arMonth[$i] ; <<<<<<<<<<<<< ========== wird eigentlich nicht benoetigt fuer die ausgabe
           Local $sRoom = _getRoom($mData, $arNames[$i], $arMonth[$i])
           If $sRoom<>-1 Then $arResult[$i][2] = "Farbe: "&$sRoom
       Next
       _ArrayDisplay($arResult) ; anzeige um zu sehen ob das ergebnis auch so klappt.
    #comments-start
    also, ich habe das jetzt zur uebersicht erst so gelassen, damit man sehen kann was rauskommen soll bei #2 um bei #3 das gleiche ergebnis zu erzielen, muss wahrscheinlich nur eine kleinigkeit veraendert werden, aber dann kommt das problem mit den gleichen daten. also mehrere datensaetze sehen gleich aus, obwohl sie es nicht sind. folglich die drei 'teil'-richtigen-loesungen.
    #comments-end
    
      ; _ArrayColDelete($arResult, 0) ; weg mit der ersten spalte. brauche ich nicht, weil hat user ja eingegeben
      ; _ArrayDisplay($arResult) ; anzeige zu testzwecken wegen geloeschter spalte!
      ; _ArrayColDelete($arResult, 0) ; weg mit der naechsten spalte. brauche ich nicht, weil hat der user eingegeben.
      ; _ArrayDisplay($arResult) ; mein gewunschtes ergebnis ... 'ja', 'ja' und nochmals 'ja' ... 'perfekt!'
    EndFunc
    Func _getRoom(ByRef $mData, $sName, $sMonth)
        If MapExists($mData, $sName) Then
            If MapExists($mData[$sName], $sMonth) Then Return $mData[$sName][$sMonth]
        EndIf
        Return -1
    EndFunc
    Func _readIniToMap($sFile, $sSection)
        Local $arSec = IniReadSection($sFile, $sSection)
        Local $mData[]
        For $i=1 To UBound($arSec)-1 Step 1
            Local $arValue = StringSplit($arSec[$i][1], ".", BitOR(1, 2)) ; wichtig: den delimiter an die ini anpassen!
            If UBound($arValue)<3 Then ContinueLoop
            If MapExists($mData, $arValue[0]) Then
                $mData[$arValue[0]][$arValue[1]] = $arValue[2]
            Else
                Local $mEntry[]
                $mEntry[$arValue[1]] = $arValue[2]
                $mData[$arValue[0]] = $mEntry
            EndIf
        Next
        Return $mData
    EndFunc
    Alles anzeigen

    ---

    es ergeben sich noch folgende fragen bezueglich der ini-datei fuer mein projekt:

    1. hier bei dem beispiel macht es zum beispiel einen unterschied was bei a+b rauskommt, und was bei b+a rauskommt, aber wie viele datensaetze kann ich in die ini einbauen? gibt es da physische danten-mengen-grenzen? - nach meiner berechnung muessten das dann hinterher 810000 eintraege in der ini-datei sein. (30x30x30x30)

    mein erster gedanke war damals anstelle von einer ini, alles in eine tabelle (array) zu legen in der alle zusammenhaenge zu sehen sind um daten nachzuschlagen, aber irgendwer sagte mal, dass es linear einfacher waere. jetzt stehe ich an der stelle wo ich wirklich ueberlegen muss ob es sinnvoll ist unter umstaenden 810000 zeilen in eine ini zu packen oder ob eine map mit der kompletten 'loesung' zu erzeugen von einer ini-datei die ggf. nicht mehr als 30 zeilen hat oder gar auf die ini zu verzichten und die 30 zeilen direkt als array bzw. map zu erstellen?

    für meine 81 eintrage habe ich eine kleine excel tabelle erstellt welche als array schneller erstellt waere als die ini zu schreiben:

    Code
    Local $testarray[5][5] = [ ["","A","B","C",""], _
    ["A","rot","gruen","gelb","D"], _
    ["B","gelb","rot","gruen","E"], _
    ["C","gruen","gelb","rot","F"], _
    ["","I","H","G",""] ]
    _ArrayDisplay($testarray)
    
    ; dauer zum schreiben des arrays GLEICH: unter 5 minuten ... ini-datei mit 81 keys GLEICH: eine gute stunde

    wenn ich das in eine map schreibe dann koennte ich mir wirklich die 81 zeilen sparen, denn dann muss ich nur noch rahmenbedinguen erstellen wo und wie nachgeschlagen werden muss? mir ist gesagt worden, dass es linear einfacher waere, denn die nachschlagebedingungen muessen ja irgendwie festgelegt werden und daran wuerde das scheitern?

    ich vermute, dass eine map meine gewunschte loesung ist, aber dann mussen exakte rahmenbedinungen der nachschlagung der daten festgelegt werden, welches wahrscheinlich sehr komplex waere? - aber letztlich wuerde ich den code von 810000 zeilen auf 30 zeilen reduzieren, denn ich muesste nur die zwei eingabefelder von den usern mit der map abgleichen und dann die entsprechende loesung nachschlagen. wobei es auch hier mindestens 3 gleiche loesungen gibt, die alle irgendwie aus ausgabe aufzulisten sind.

    ich hoffe das ergibt alles ein wenig sinn?

    hier geht es um zwei dinge: beratung (was ist sinnvoll) und hilfe bei der festlegung der nachschlagebedingungen sowie dem bau der map

    gruss

    bankesbusters

    ps: es ist verdammt schwer das alles in verneunftige verstaendliche worte zu packen, denn ich habe hier excel tabellen wo ich sehe was ich machen moechte, aber die seht der leser nicht und folglich kann man sich das nicht wirklich vorstellen was ich machen moechte. wobei der map ansatz bislang das vielversprechenste ist, glaube ich.

  • ConsoleWrite() und Fehlermeldungen darin unter bestimmten Bedingungen

    • bankesbusters
    • 26. April 2025 um 13:36

    hallo zusammen,

    ich glaube nicht, dass dies in programmieranfragen gehoert, denn es geht hierbei nicht um programmierfragen, sondern wohl eher um verstaendnisfragen und dabei ist es total egal um welche art von script es sich dabei handelt. die meisten probleme entstehen immer mit und bei For-To-Next-Schleifen und es ist fuer micht fast unmoeglich herauszufinden wieso da fehler auftauchen, also folgende sache habe ich versucht:

    Code
    #include <Array.au3>
    Global $numbers2[144] = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, _
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, _
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, _
    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, _
    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, _
    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, _
    1,1,1,1,1,1,1,1,1,1,1]
    ;_ArrayDisplay($numbers2,"Zeros & Ones")
    _ArrayShuffle($numbers2) ; shuffle me once ... 
    ;_ArrayDisplay($numbers2, "Shuffle #1")
    _ArrayShuffle($numbers2) ; shuffle me twice ... 
    ;_ArrayDisplay($numbers2, "Shuffle #2")
    _ArrayShuffle($numbers2) ; shuffle me nice ... 
    ;_ArrayDisplay($numbers2, "Shuffle #3")
    _ArrayShuffle($numbers2) ; shuffle me more ... 
    ;_ArrayDisplay($numbers2, "Shuffle #4")
    _ArrayShuffle($numbers2) ; shuffle me to get the score ... 
    ;_ArrayDisplay($numbers2, "Shuffle #5")
    Global $numbers1[144] = [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,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48, _
    49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72, _
    73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,94,96, _
    97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115, _
    116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133, _
    134,135,136,137,138,139,140,141,142,143,144]
    ;_ArrayDisplay($numbers1,"Numbers")
    _ArrayShuffle($numbers1) ; shuffle me once ... 
    ;_ArrayDisplay($numbers1, "Shuffle #1")
    _ArrayShuffle($numbers1) ; shuffle me twice ... 
    ;_ArrayDisplay($numbers1, "Shuffle #2")
    _ArrayShuffle($numbers1) ; shuffle me nice ... 
    ;_ArrayDisplay($numbers1, "Shuffle #3")
    _ArrayShuffle($numbers1) ; shuffle me more ... 
    ;_ArrayDisplay($numbers1, "Shuffle #4")
    _ArrayShuffle($numbers1) ; shuffle me to get the score ... 
    ;_ArrayDisplay($numbers1, "Shuffle #5")
    Alles anzeigen

    das ist der basis code den ich jetzt verwendet habe. nun kommen meine fragen und fehlermeldungen aus der ConsoleWrite() funktion:

    Code
    For $a = 0 To 144
        For $b = 0 To 144
    ConsoleWrite("Dice: " & $numbers2[$b] & " ----------> " & " Number: " & $numbers1[$b] &@CRLF)
    Next
    Next

    ConsoleWrite() spuckt folgendes aus (stark verkuerzt):

    Code
    Dice: 1 ---------->  Number: 28
    Dice: 1 ---------->  Number: 64
    Dice: 0 ---------->  Number: 90
    Dice: 0 ---------->  Number: 98
    Dice: 1 ---------->  Number: 6
    [ ... ]
    Dice: 1 ---------->  Number: 35
    Dice: 0 ---------->  Number: 69
    Dice: 1 ---------->  Number: 10
    "E:\autoitscripts\2025\simple-random-number-generator.au3" (69) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
    ConsoleWrite("Dice: " & $numbers2[$b] & " ----------> " & " Number: " & $numbers1[$b] &@CRLF)
    ConsoleWrite("Dice: " & ^ ERROR
    Alles anzeigen

    *perfekt* ... es sind exakt 144 ergebnisse und alles ist super. aber jetzt kommts. ich behebe den fehler auf viele arten und weisen wie ich gelernt habe mit UBound() oder mit $strings oder mit der korrekten anzahl (143) und jedes mal kommen dann andere sachen zu tage:

    Code
    For $a = 0 To $numbers2
        For $b = 0 To $numbers1
    ConsoleWrite("Dice: " & $numbers2[$b] & " ----------> " & " Number: " & $numbers1[$b] &@CRLF)
    Next
    Next

    entspricht: eine einzige zeile ...

    Code
    +>Setting Hotkeys...--> Press Ctrl+Alt+Break to Restart or Ctrl+BREAK to Stop.
    Dice: 0 ---------->  Number: 102
    +>12:55:35 AutoIt3.exe ended.rc:0
    +>12:55:35 AutoIt3Wrapper Finished.

    UBound() ... mmh ... noch viel schlechter:

    Code
    For $a = 0 To UBound($numbers2) - 1
        For $b = 0 To UBound($numbers1) - 1
    ConsoleWrite("Dice: " & $numbers2[$b] & " ----------> " & " Number: " & $numbers1[$b] &@CRLF)
    Next
    Next

    extrem gekuerzt ... (insgesamt 20736 Zeilen ausgegeben):

    Code
    Dice: 1 ---------->  Number: 42
    Dice: 0 ---------->  Number: 119
    Dice: 1 ---------->  Number: 47
    Dice: 1 ---------->  Number: 109
    [ ... ]
    Dice: 0 ---------->  Number: 12
    Dice: 1 ---------->  Number: 5
    Dice: 0 ---------->  Number: 133
    +>12:57:22 AutoIt3.exe ended.rc:0
    +>12:57:22 AutoIt3Wrapper Finished.
    >Exit code: 0    Time: 2.166
    Alles anzeigen

    das beste war wirklich das es 20736 zeilen waren welches genau 144 x 144 entspricht. also offensichtlich mal wieder das problem vor dem bildschirm. mich hat allerdings die ausgabe von nur einer einzigen zeile gewundert, denn alle diese moeglichkeiten sind auf array seiten zu finden und scheinen zu funktionieren, nur eben nie so wirklich bei mir. mein bestes ergebnis, war das wo ich 144 anstelle von 143 angegeben hatte. ... im uebrigen bei der korrekten angabe von 143:

    Code
    For $a = 0 To 143
        For $b = 0 To 143
    ConsoleWrite("Dice: " & $numbers2[$b] & " ----------> " & " Number: " & $numbers1[$b] &@CRLF)
    Next
    Next

    waren es dann auch 20736 zeilen. ... overkill deluxe

    mein eigentlicher plan war es die random funktion einzusetzen und das noch mit einzubauen, aber soweit kam ich erst gar nicht mit den ausgaben der ConsoleWrite() funktion.

    Code
    ;$y = Random(0, 1, 1)
        ;MsgBox(0,"", $a & " --- " & $y & " 0 = Top / 1 = Bottom")

    ich habe glaube ich noch 30 andere fassungen probiert und nur eine for-to-next-schleife verwendet, dann kamen fehler wie $b ist nicht deklariert oder, oder, oder! auch habe ich probiert den wert von $a und/oder $b auf 1 zu setzen aber das brachte keinen grossen unterschied. wirklich. ich habe so viele variationen davon probiert, aber nur mit der angabe von zu vielen zeilen konnte ich das korrekte ergebnis erzielen. sehr seltsam

    also irgendwie ist es mir ein raetsel. und das was mich am meisten irritiert hat, war das wenn ich den string (array) im for loop angebe, dann kommt nur eine einzige zeile.


    nach dem ganzen experimenten kam ich dann irgendwann auf eine loesung, die zumindest keine fehlermeldung ausspuckte ... aber nur 99 Zeilen:

    Code
    For $a = 0 To $numbers2[$a]
        For $b = 0 To $numbers1[$b]
    ConsoleWrite("Dice: " & $numbers2[$b] & " ----------> " & " Number: " & $numbers1[$b] &@CRLF)
    Next
    Next

    wobei, eigentlich duerfte meiner meinung nach das nicht funktionieren, denn ich deklariere $a und verwende es gleichzeitig mit, welches nach meinem verstaendnis eigentlich ein fehler ausspucken sollte in sachen $a wird benutzt bevor es ueberhaupt deklariert ist, aber irgendwie tut es so. verstehen muss ich das nicht, oder? ... dabei fiel mir dann hinterher auf, dass zwar kein fehler kommt, aber es nur 99 zeilen ausspuckt und nicht die 144 zeilen die es eigentlich soll. also war das wohl auch nicht wirklich richtig.

    die For-To-Next-Schleife = das buch mit sieben siegeln! ... toll wenn man es kann, ein krampf wenn man nicht versteht warum etwas nicht stimmt bzw. wo man nach den fehlern suchen soll.

    der letzte und neueste versuch war:

    Code
    For $a = 0 To $numbers2[$a] - 1
        For $b = 0 To $numbers1[$b] - 1
    ConsoleWrite("Dice: " & $numbers2[$b] & " ----------> " & " Number: " & $numbers1[$b] &@CRLF)
    Next
    Next

    ergebnis: keine fehler aber nur 122 zeilen. what? wo kommen die anzahl der zeilen in der console her?

    na ja, alles sehr spannend. ... bestimmt auch noch spannender wenn man es kann.

    gruss

    bankesbusters

  • map fuer ein magisches quadrat und dessen aufloesung

    • bankesbusters
    • 26. April 2025 um 12:34

    hi,

    also ... nach etlichen (langen) tests und vielen vielen fehlversuchen, (ich habe alles richtig abgeschrieben, alles kontrolliert und trotzdem schlichen sich fehler immer wieder ein!), kann ich sagen, dass die Version von Schnuffel fuer meine zwecke zu 100% perfekt ist und alles so tut wie es tun soll. das ist sowas von genial! Danke vielmals!

    natuerlich moechte ich die arbeit von Kanashius nicht schmaelern, denn sie ist auf eine andere art auch total genial und spannend zugleich, denn sie geht noch einige extra schritte weiter, die zwar nicht notwendig waren, aber total klasse sind. auf jeden fall ein script, welches ich ggf. auch noch mal verwenden werde. tolle sache.

    also, beides wirklich toll und auch verschieden in der herangehensweise.

    euch beiden einen ganz dicken dank an dieser stelle. ich weiss eure hilfe stets zu schaetzen. danke sehr.

    gruss

    bankesbusters

  • map fuer ein magisches quadrat und dessen aufloesung

    • bankesbusters
    • 21. April 2025 um 16:40

    hi,

    als der rest der familie ein wenig spazieren war und ich mit den vorbereitungen vom essen durch war, habe ich noch eine kurze weile hinsetzen koennen und experimentieren koennen und habe es dann hiermit versucht (nur die eingentliche For-To-Next-Schleife):

    Code
    For $i = 0 To UBound($iniOutput) - 1
    For $j = 0 To UBound($iniOutput, 2) - 1
    Local $index = Int($iniOutput[$i][$j]) ; Um den Wert als Ganzzahl zu verwenden
    If $index >= 1 And $index <= UBound($arr_text) Then
    $result[$index] = $arr_text[$index]
    EndIf
    Next
    Next

    das hat aber nicht geklappt gehabt, weil ich keinen weg gefunden hatte dort den $arr_text von der nummer her anders zu gestalten. sprich das script griff immer nur die exakt gleichen nummern ab, aber der code war auf das absolute minimum verkuerzt worden. nur eben die funktion nicht wirklich.

    ich werde heute mir mal die anderen obigen ideen anschauen und mal sehen ob ich mich dadurch kaempfen kann. ... aber wie immer: auf jeden fall bereits ein dickes danke an dieser stelle an Schnuffel und Kanashius

    Kanashius hat ja bald mehr geschrieben wie mein original. ich bin so gespannt.

    gruss


    PS: hoffe schoene ostern gehabt zu haben an alle.


    *grund fuer edit: vergessen code in codedarstellung zu packen

  • map fuer ein magisches quadrat und dessen aufloesung

    • bankesbusters
    • 19. April 2025 um 17:25

    hallo zusammen,

    bevor die familie gleich mein ganzes wochenende belagert, habe ich noch schnell fragen zu map coding und moeglichkeiten hierin.

    ich poste ein voll funktionsfaehiges script. es laeuft und tut genau das was es soll, aber es ist viel zu lang und bislang sind alle versuche es irgendwie zu kuerzen gescheitert. ich habe viel zeit mit versuchen das irgendwie in einer 'map' zu verschachteln verbracht und dann damit regeln zu verfassen womit die map arbeiten soll. das ganze scheiterte daran, dass ich die map von Kanashius aus einem meiner letzten thema weiter getestet habe, aber irgendwie gar nicht verstehe wo ich was genau aendern muss damit ich es erweitern oder veraendern kann. damit ich aber nicht ungluecklich werde habe ich es dann manuell geschrieben, so das es genau das tut was es tun soll gemaess den regeln die ich dem ganzen mitgegeben habe.

    es handelt sich um die verwendung eines sog. magischen quadrates (das einfachste was es gibt) ... zu finden in youtube unter dem suchbegriff:

    "12 x 12 Magic Square! Easiest Method ! Don't miss !" ( youtube.com/watch?v=HBd8ZM6aEOw )

    also das ist meine ini datei die ich mittels einer map verwenden moechte. ich habe also einen text geschrieben mit 144 woertern und habe ihn dann gemaess diesem magischen quadrat von den worten her angeordnet, damit ich dann durch das script den richtigen text wieder anzeigen lassen kann. (ja, es sind alles nur spielereien)

    auf jeden fall habe ich versucht die felder abzurufen und an der entsprechenden stelle wieder einzufuegen. klappt alles prima, aber sind halt 144 zeilen in einer For-To-Next-Schleife und jegliche versuche irgendwo einen zaehler einzubauen sind gescheitert, weil es auch unregelmaessig ist, aber seht selbst:

    ini datei:

    Code
    [DATA]
    key01=1.2.3.141.140.139.138.137.136.10.11.12
    key02=13.14.15.129.128.127.126.125.124.22.23.24
    key03=25.26.27.117.116.115.114.113.112.34.35.36
    key04=108.107.106.40.41.42.43.44.45.99.98.97
    key05=96.95.94.52.53.54.55.56.57.87.86.85
    key06=84.83.82.64.65.66.67.68.69.75.74.73
    key07=72.71.70.76.77.78.79.80.81.63.62.61
    key08=60.59.58.88.89.90.91.92.93.51.50.49
    key09=48.47.46.100.101.102.103.104.105.39.38.37
    key10=109.110.111.33.32.31.30.29.28.118.119.120
    key11=121.122.123.21.20.19.18.17.16.130.131.132
    key12=133.134.135.9.8.7.6.5.4.142.143.144
    Alles anzeigen

    AutoIT-script:

    C
    #include <MsgBoxConstants.au3>
    #include <Array.au3>
    #comments-start
    als erstes holen wir uns die einzig _richtige_ loesung aus einer ini datei zum spaeteren vergleich:
    #comments-end
    Global $ini = @ScriptDir & "\magic.ini"
    Global $iniOutput[1][1]
    Global $sections = IniReadSectionNames($ini)
    For $a = 1 To UBound($sections) - 1
       $keys = IniReadSection($ini, $sections[$a])
        Redim $iniOutput[UBound($keys)][12]
       For $b = 1 To UBound($keys) - 1
           $data = StringSplit($keys[$b][1], '.')
            $iniOutput[$b][0] = $data[1]
            $iniOutput[$b][1] = $data[2]
            $iniOutput[$b][2] = $data[3]
            $iniOutput[$b][3] = $data[4]
            $iniOutput[$b][4] = $data[5]
            $iniOutput[$b][5] = $data[6]
            $iniOutput[$b][6] = $data[7]
            $iniOutput[$b][7] = $data[8]
            $iniOutput[$b][8] = $data[9]
            $iniOutput[$b][9] = $data[10]
            $iniOutput[$b][10] = $data[11]
            $iniOutput[$b][11] = $data[12]
       Next
    Next
    _ArrayDisplay($iniOutput) ;  dies ist nur ein test zur kontrolle der daten!
    _ArrayDelete($iniOutput, 0) ; wir loeschen die leere zeile am anfang des arrays
    _ArrayDisplay($iniOutput) ; dies ist nur ein test zur kontrolle der daten!
    Global $text
    $text = "dieses kleine aber ihr und testen zu scripte kleine einen total konfus " & @CRLF & _
            "gewirbelten satz durch sortieren. zu woerter ganzen die dabei lesbaren string bzw. " & @CRLF & _
            "array verwandeln. es auch es damit muss stehen eigentlich mal zwoelf rasters "  & @CRLF & _
            "wort richtige das magisches quadrat dar. es ist das dann um muss " & @CRLF & _
            "stehen wort welches es im internet zu finden gibt. in vorher ganze " & @CRLF & _
            "das habe ich in jeweils zwoelf reihen und zwoelf somit spalten. zwoelf " & @CRLF & _
            "jeweils in worten sind es dann insgesamt 144 worte. worten zwoelf aus " & @CRLF & _
            "also besteht es libre office calc ausrechen lassen wo was quadrat magische " & @CRLF & _
            "simpelste bzw. einfachste eine ini datei zu schreiben wo ein stellt und " & @CRLF & _
            "aus dem text zwoelf eines prinzip dem auf basiert einen sinn ergibt. " & @CRLF & _
            "AutoIT hilft dann einen in wieder map ini eine ich finde das " & @CRLF & _
            "immer so toll soll script test AutoIT feine durchaus hoffentlich dann auch!" & @CRLF
    ;ConsoleWrite($text)
    $arr_text = StringSplit($text, " ")
    _ArrayDisplay($arr_text, "text jumble")
    #comments-start
    jetzt folgt der manuelle versuch die daten zu sortieren. ... soviel vorab, es klappt!
    #comments-end
    
    Local $result[UBound($arr_text)]
    ;ConsoleWrite("-----------"&"ini Array lookup"&"-----------"&@crlf)
    For $i = 0 To UBound($iniOutput) - 1 Step 1
        For $j = 0 To UBound($iniOutput, 2) - 1 Step 1
            ;ConsoleWrite("Access $iniOutput["&$i&"]["&$j&"]: "&$iniOutput[$i][$j]&@crlf)
            ;>>>>>>>>>>>>>>>>> If $iniOutput[$i][$j] = "5" Then $result[2] = $arr_text[140] ; <<<<<<<<<<<<<<<< syntax zur manuellen funktion
            If $iniOutput[$i][$j] = "1" Then $result[1] = $arr_text[1]
            If $iniOutput[$i][$j] = "2" Then $result[2] = $arr_text[2]
            If $iniOutput[$i][$j] = "3" Then $result[3] = $arr_text[3]
            If $iniOutput[$i][$j] = "4" Then $result[4] = $arr_text[141]
            If $iniOutput[$i][$j] = "5" Then $result[5] = $arr_text[140]
            If $iniOutput[$i][$j] = "6" Then $result[6] = $arr_text[139]
            If $iniOutput[$i][$j] = "7" Then $result[7] = $arr_text[138]
            If $iniOutput[$i][$j] = "8" Then $result[8] = $arr_text[137]
            If $iniOutput[$i][$j] = "9" Then $result[9] = $arr_text[136]
            If $iniOutput[$i][$j] = "10" Then $result[10] = $arr_text[10]
            If $iniOutput[$i][$j] = "11" Then $result[11] = $arr_text[11]
            If $iniOutput[$i][$j] = "12" Then $result[12] = $arr_text[12]
            If $iniOutput[$i][$j] = "13" Then $result[13] = $arr_text[13]
            If $iniOutput[$i][$j] = "14" Then $result[14] = $arr_text[14]
            If $iniOutput[$i][$j] = "15" Then $result[15] = $arr_text[15]
            If $iniOutput[$i][$j] = "16" Then $result[16] = $arr_text[129]
            If $iniOutput[$i][$j] = "17" Then $result[17] = $arr_text[128]
            If $iniOutput[$i][$j] = "18" Then $result[18] = $arr_text[127]
            If $iniOutput[$i][$j] = "19" Then $result[19] = $arr_text[126]
            If $iniOutput[$i][$j] = "20" Then $result[20] = $arr_text[125]
            If $iniOutput[$i][$j] = "21" Then $result[21] = $arr_text[124]
            If $iniOutput[$i][$j] = "22" Then $result[22] = $arr_text[22]
            If $iniOutput[$i][$j] = "23" Then $result[23] = $arr_text[23]
            If $iniOutput[$i][$j] = "24" Then $result[24] = $arr_text[24]
            If $iniOutput[$i][$j] = "25" Then $result[25] = $arr_text[25]
            If $iniOutput[$i][$j] = "26" Then $result[26] = $arr_text[26]
            If $iniOutput[$i][$j] = "27" Then $result[27] = $arr_text[27]
            If $iniOutput[$i][$j] = "28" Then $result[28] = $arr_text[117]
            If $iniOutput[$i][$j] = "29" Then $result[29] = $arr_text[116]
            If $iniOutput[$i][$j] = "30" Then $result[30] = $arr_text[115]
            If $iniOutput[$i][$j] = "31" Then $result[31] = $arr_text[114]
            If $iniOutput[$i][$j] = "32" Then $result[32] = $arr_text[113]
            If $iniOutput[$i][$j] = "33" Then $result[33] = $arr_text[112]
            If $iniOutput[$i][$j] = "34" Then $result[34] = $arr_text[34]
            If $iniOutput[$i][$j] = "35" Then $result[35] = $arr_text[35]
            If $iniOutput[$i][$j] = "36" Then $result[36] = $arr_text[36]
            If $iniOutput[$i][$j] = "37" Then $result[37] = $arr_text[108]
            If $iniOutput[$i][$j] = "38" Then $result[38] = $arr_text[107]
            If $iniOutput[$i][$j] = "39" Then $result[39] = $arr_text[106]
            If $iniOutput[$i][$j] = "40" Then $result[40] = $arr_text[40]
            If $iniOutput[$i][$j] = "41" Then $result[41] = $arr_text[41]
            If $iniOutput[$i][$j] = "42" Then $result[42] = $arr_text[42]
            If $iniOutput[$i][$j] = "43" Then $result[43] = $arr_text[43]
            If $iniOutput[$i][$j] = "44" Then $result[44] = $arr_text[44]
            If $iniOutput[$i][$j] = "45" Then $result[45] = $arr_text[45]
            If $iniOutput[$i][$j] = "46" Then $result[46] = $arr_text[99]
            If $iniOutput[$i][$j] = "47" Then $result[47] = $arr_text[98]
            If $iniOutput[$i][$j] = "48" Then $result[48] = $arr_text[97]
            If $iniOutput[$i][$j] = "49" Then $result[49] = $arr_text[96]
            If $iniOutput[$i][$j] = "50" Then $result[50] = $arr_text[95]
            If $iniOutput[$i][$j] = "51" Then $result[51] = $arr_text[94]
            If $iniOutput[$i][$j] = "52" Then $result[52] = $arr_text[52]
            If $iniOutput[$i][$j] = "53" Then $result[53] = $arr_text[53]
            If $iniOutput[$i][$j] = "54" Then $result[54] = $arr_text[54]
            If $iniOutput[$i][$j] = "55" Then $result[55] = $arr_text[55]
            If $iniOutput[$i][$j] = "56" Then $result[56] = $arr_text[56]
            If $iniOutput[$i][$j] = "57" Then $result[57] = $arr_text[57]
            If $iniOutput[$i][$j] = "58" Then $result[58] = $arr_text[87]
            If $iniOutput[$i][$j] = "59" Then $result[59] = $arr_text[86]
            If $iniOutput[$i][$j] = "60" Then $result[60] = $arr_text[85]
            If $iniOutput[$i][$j] = "61" Then $result[61] = $arr_text[84]
            If $iniOutput[$i][$j] = "62" Then $result[62] = $arr_text[83]
            If $iniOutput[$i][$j] = "63" Then $result[63] = $arr_text[82]
            If $iniOutput[$i][$j] = "64" Then $result[64] = $arr_text[64]
            If $iniOutput[$i][$j] = "65" Then $result[65] = $arr_text[65]
            If $iniOutput[$i][$j] = "66" Then $result[66] = $arr_text[66]
            If $iniOutput[$i][$j] = "67" Then $result[67] = $arr_text[67]
            If $iniOutput[$i][$j] = "68" Then $result[68] = $arr_text[68]
            If $iniOutput[$i][$j] = "69" Then $result[69] = $arr_text[69]
            If $iniOutput[$i][$j] = "70" Then $result[70] = $arr_text[75]
            If $iniOutput[$i][$j] = "71" Then $result[71] = $arr_text[74]
            If $iniOutput[$i][$j] = "72" Then $result[72] = $arr_text[73]
            If $iniOutput[$i][$j] = "73" Then $result[73] = $arr_text[72]
            If $iniOutput[$i][$j] = "74" Then $result[74] = $arr_text[71]
            If $iniOutput[$i][$j] = "75" Then $result[75] = $arr_text[70]
            If $iniOutput[$i][$j] = "76" Then $result[76] = $arr_text[76]
            If $iniOutput[$i][$j] = "77" Then $result[77] = $arr_text[77]
            If $iniOutput[$i][$j] = "78" Then $result[78] = $arr_text[78]
            If $iniOutput[$i][$j] = "79" Then $result[79] = $arr_text[79]
            If $iniOutput[$i][$j] = "80" Then $result[80] = $arr_text[80]
            If $iniOutput[$i][$j] = "81" Then $result[81] = $arr_text[81]
            If $iniOutput[$i][$j] = "82" Then $result[82] = $arr_text[63]
            If $iniOutput[$i][$j] = "83" Then $result[83] = $arr_text[62]
            If $iniOutput[$i][$j] = "84" Then $result[84] = $arr_text[61]
            If $iniOutput[$i][$j] = "85" Then $result[85] = $arr_text[60]
            If $iniOutput[$i][$j] = "86" Then $result[86] = $arr_text[59]
            If $iniOutput[$i][$j] = "87" Then $result[87] = $arr_text[58]
            If $iniOutput[$i][$j] = "88" Then $result[88] = $arr_text[88]
            If $iniOutput[$i][$j] = "89" Then $result[89] = $arr_text[89]
            If $iniOutput[$i][$j] = "90" Then $result[90] = $arr_text[90]
            If $iniOutput[$i][$j] = "91" Then $result[91] = $arr_text[91]
            If $iniOutput[$i][$j] = "92" Then $result[92] = $arr_text[92]
            If $iniOutput[$i][$j] = "93" Then $result[93] = $arr_text[93]
            If $iniOutput[$i][$j] = "94" Then $result[94] = $arr_text[51]
            If $iniOutput[$i][$j] = "95" Then $result[95] = $arr_text[50]
            If $iniOutput[$i][$j] = "96" Then $result[96] = $arr_text[49]
            If $iniOutput[$i][$j] = "97" Then $result[97] = $arr_text[48]
            If $iniOutput[$i][$j] = "98" Then $result[98] = $arr_text[47]
            If $iniOutput[$i][$j] = "99" Then $result[99] = $arr_text[46]
            If $iniOutput[$i][$j] = "100" Then $result[100] = $arr_text[100]
            If $iniOutput[$i][$j] = "101" Then $result[101] = $arr_text[101]
            If $iniOutput[$i][$j] = "102" Then $result[102] = $arr_text[102]
            If $iniOutput[$i][$j] = "103" Then $result[103] = $arr_text[103]
            If $iniOutput[$i][$j] = "104" Then $result[104] = $arr_text[104]
            If $iniOutput[$i][$j] = "105" Then $result[105] = $arr_text[105]
            If $iniOutput[$i][$j] = "106" Then $result[106] = $arr_text[39]
            If $iniOutput[$i][$j] = "107" Then $result[107] = $arr_text[38]
            If $iniOutput[$i][$j] = "108" Then $result[108] = $arr_text[37]
            If $iniOutput[$i][$j] = "109" Then $result[109] = $arr_text[109]
            If $iniOutput[$i][$j] = "110" Then $result[110] = $arr_text[110]
            If $iniOutput[$i][$j] = "111" Then $result[111] = $arr_text[111]
            If $iniOutput[$i][$j] = "112" Then $result[112] = $arr_text[33]
            If $iniOutput[$i][$j] = "113" Then $result[113] = $arr_text[32]
            If $iniOutput[$i][$j] = "114" Then $result[114] = $arr_text[31]
            If $iniOutput[$i][$j] = "115" Then $result[115] = $arr_text[30]
            If $iniOutput[$i][$j] = "116" Then $result[116] = $arr_text[29]
            If $iniOutput[$i][$j] = "117" Then $result[117] = $arr_text[28]
            If $iniOutput[$i][$j] = "118" Then $result[118] = $arr_text[118]
            If $iniOutput[$i][$j] = "119" Then $result[119] = $arr_text[119]
            If $iniOutput[$i][$j] = "120" Then $result[120] = $arr_text[120]
            If $iniOutput[$i][$j] = "121" Then $result[121] = $arr_text[121]
            If $iniOutput[$i][$j] = "122" Then $result[122] = $arr_text[122]
            If $iniOutput[$i][$j] = "123" Then $result[123] = $arr_text[123]
            If $iniOutput[$i][$j] = "124" Then $result[124] = $arr_text[21]
            If $iniOutput[$i][$j] = "125" Then $result[125] = $arr_text[20]
            If $iniOutput[$i][$j] = "126" Then $result[126] = $arr_text[19]
            If $iniOutput[$i][$j] = "127" Then $result[127] = $arr_text[18]
            If $iniOutput[$i][$j] = "128" Then $result[128] = $arr_text[17]
            If $iniOutput[$i][$j] = "129" Then $result[129] = $arr_text[16]
            If $iniOutput[$i][$j] = "130" Then $result[130] = $arr_text[130]
            If $iniOutput[$i][$j] = "131" Then $result[131] = $arr_text[131]
            If $iniOutput[$i][$j] = "132" Then $result[132] = $arr_text[132]
            If $iniOutput[$i][$j] = "133" Then $result[133] = $arr_text[133]
            If $iniOutput[$i][$j] = "134" Then $result[134] = $arr_text[134]
            If $iniOutput[$i][$j] = "135" Then $result[135] = $arr_text[135]
            If $iniOutput[$i][$j] = "136" Then $result[136] = $arr_text[9]
            If $iniOutput[$i][$j] = "137" Then $result[137] = $arr_text[8]
            If $iniOutput[$i][$j] = "138" Then $result[138] = $arr_text[7]
            If $iniOutput[$i][$j] = "139" Then $result[139] = $arr_text[6]
            If $iniOutput[$i][$j] = "140" Then $result[140] = $arr_text[5]
            If $iniOutput[$i][$j] = "141" Then $result[141] = $arr_text[4]
            If $iniOutput[$i][$j] = "142" Then $result[142] = $arr_text[142]
            If $iniOutput[$i][$j] = "143" Then $result[143] = $arr_text[143]
            If $iniOutput[$i][$j] = "144" Then $result[144] = $arr_text[144]
        Next
    Next
    _ArrayDisplay($result)
    _ArrayDelete($result, 0) ; wir loeschen die leere zeile am anfang des arrays
    _ArrayDisplay($result) ; dies ist nur ein test zur kontrolle der daten!
    $corrected_text = _ArrayToString($result, " ")
    MsgBox(0, "output", $corrected_text)
    Alles anzeigen

    also, ich hatte ein wert $k versucht als zaehler, aber es aenderte nicht wirklich etwas an der laenge, denn der auszugebene text springt ja wirklich durch die zeilen wie ein osterhase auf drogen. also ist zunaechst die erste frage:

    1. kann der code durch clevere zaehler verkuerzt werden? wenn ja, wie und wo?

    die zweite frage ist dann die nutzung einer map. also das ist fuer mich so undurchsichtig, dass ich nocht nicht mal weiss wie wo was ich genau brauche um eine verbindung der zeilennummern zur ini herzustellen um dann eine korrekte ausgabe zu erhalten. also zweite frage:

    2. map? - ja gerne, aber wie? mit lerneffekt gerne gewuenscht.

    leider muss ich nun das restliche wochenende aufs internet verzichten, denn wir bekommen gleich familien besuch und die bleiben das ganze osterfest. aber was macht man nicht alles fuer die familie.

    das thema hier hat also keine eile, ich kann eh nicht vor montag/dienstag checken ob jemand geantwortet hat.

    geniesst alle das osterfest.

    bis bald.

    bankesbusters


    PS: eines meiner sachen habe ich selbst geregelt bekommen von meiner to-do-liste: zahlen mit ini einlesen, werte veraendern je spalte und dann weiterverwenden. hat erstaunlich einfach mehr oder weniger auf anhieb geklappt. also stueck fuer stueck lerne ich fleissig weiter.

  • array(s) nach daten durchsuchen und zuordnen und damit dann ein neues array anlegen

    • bankesbusters
    • 18. April 2025 um 15:42

    ah, ok ... ergibt sinn. also muss ich mich auch damit wohl beschaeftigen. auf liste hinzugefuegt. danke fuer den tip.

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™