Witajcie!
Muszę napisać aplikację, w której po wpisaniu do okienka pewnego parametru - przyjmijmy, że jest to liczba 780 - w okienku poniżej ukaże się lista wyboru opcji . Ta lista musi się zmieniać właśnie w zależności od tej liczby. Przykładowo, gdy jest wspomniane przeze mnie 780 to w liscie mają byc opcje : a i b - powinno dać się wybrać jedno z nich i w zależności od wybranej opcji uruchomiona zostaje procedura wyliczenia (wybor opcji -> pobranie nazwy opcji badz tez po wybraniu automatyczne uruchomienie wyliczenia innego parametru) innego parametru. Po wpisaniu innej liczby np 800 pojawiaja sie juz np trzy opcje. Czy kojarzycie, w których językach programowania jest to stosunkowo łatwe do ogarnięcia? nie robiłam jeszcze list dynamicznych stąd moje pytanko.
Pozdrawiam
Delphi, C++... wszystko, w czym można stworzyć i oprogramować GUI (w przypadku Delphi masz wbudowany edytor okienek, w QtCreatorze do C++ chyba także można projektować okienka).
Naprawdę dowolny, jest to całkiem proste zadanie. Możesz np. spróbować C++ Qt. Jeżeli sensownie to sobie rozplanujesz to znaczną część będziesz mogła sobie nawet "wyklikać".
- Coś długo te posty piszę :/
okienko to wiem mniej więcej jak stworzyć. Tylko problem mam z wymyśleniem tej dynamicznej listy wyboru. Ma ktoś może gdzieś implementacje takiego czegoś? Myślałam też o tym, aby napisać to w Javie - czy to dobry pomysł? między innymi ze względu na fakt możliwości wygenerowania sobie jara.
A może dodaj te wszystkie okienka które chcesz by potem się pojawiały i ustaw jako niewidoczne. Jak użytkownik wybierze daną pozycję, to odkryj ten co potrzeba żeby był widoczny. To jest taki mało elegancje co prawda ale powinno działac...
np. w C WinApi:
HWND hUchwyt = CreateWindowEx(0, "LISTBOX", NULL, WS_CHILD | WS_VISIBLE, 0, 0, 100, 50, hwnd, (HMENU)1, hThisInstance, NULL);
SendMessage(hUchwyt, LB_ADDSTRING, 0, (LPARAM)"odpowiedź A");
SendMessage(hUchwyt, LB_ADDSTRING, 0, (LPARAM)"odpowiedź B");
zmiana odpowiedzi:
//usuwanie dwóch poprzednich wariantów
SendMessage(hUchwyt, LB_DELETESTRING, 0, 0);
SendMessage(hUchwyt, LB_DELETESTRING, 0, 0);
//dodanie nowych
SendMessage(hUchwyt, LB_ADDSTRING, 0, (LPARAM)"odpowiedź C");
SendMessage(hUchwyt, LB_ADDSTRING, 0, (LPARAM)"odpowiedź Z");
Aby odczytać liczbę użyć można Edit'a i zwyczajnie tekst zamienić na liczbę:
HWND edit = createWindowEx( ... );
//aby pobrac tekst z edita do bufora
int dlugosc = GetWindowTextLength(edit);
char* tekst = (char*) malloc (dlugosc+1);
GetWindowText(edit, tekst, dlugosc+1);
//konwertujemy tekst na liczbe
int liczba = atoi(tekst);
//wyswietlamy odpowiednie warianty względem liczby
switch(liczba)
{
case 108:
SendMessage(hUchwyt, LB_DELETESTRING, 0, 0);
SendMessage(hUchwyt, LB_DELETESTRING, 0, 0);
SendMessage(hUchwyt, LB_ADDSTRING, 0, (LPARAM)"odpowiedź C");
SendMessage(hUchwyt, LB_ADDSTRING, 0, (LPARAM)"odpowiedź Z");
break;
}
Nie wiem czy o to chodziło
SendMessage(hUchwyt, LB_ADDSTRING, 0, (LPARAM)"odpowiedź A");
Jest taki bardzo fajny nagłówek <windowsx.h>
, a w nim
ListBox_AddString(hUchwyt, "odpowiedź A");
i wiele innych bardzo ciekawych rzeczy ;-)
Można zapomnieć o WPARAM/LPARAM i co ma być w którym, wszędzie wszystkie parametry ponazywane, w WndProc także.
amyska napisał(a):
Witajcie!
Muszę napisać aplikację, w której po wpisaniu do okienka pewnego parametru - przyjmijmy, że jest to liczba 780 - w okienku poniżej ukaże się lista wyboru opcji . Ta lista musi się zmieniać właśnie w zależności od tej liczby. Przykładowo, gdy jest wspomniane przeze mnie 780 to w liscie mają byc opcje : a i b - powinno dać się wybrać jedno z nich i w zależności od wybranej opcji uruchomiona zostaje procedura wyliczenia (wybor opcji -> pobranie nazwy opcji badz tez po wybraniu automatyczne uruchomienie wyliczenia innego parametru) innego parametru. Po wpisaniu innej liczby np 800 pojawiaja sie juz np trzy opcje. Czy kojarzycie, w których językach programowania jest to stosunkowo łatwe do ogarnięcia? nie robiłam jeszcze list dynamicznych stąd moje pytanko.
Pozdrawiam
Hej,
Przygotowałem Ci mały programik demo w Javie wykorzystujący JTextField oraz JList. JTextField korzysta z KeyListener'a więc w zależności od tego co w nim wprowadzisz zmieni się również zawartość JList. W tym wypadku zawartością JList będą Twoje opcje. Programik ma zaimplementowane cztery "stany", czyli reaguje na 4 przedziały wprowadzonej wartości w JTextField (null, 0-100, 101-200, >200). Zapewne implementacja nie jest doskonała, ale powinnaś załapać o co chodzi.
Screen:
Link do pobrania aplikacji demo:
http://wrzucacz.pl/file/2441376492687/JListDemo.jar
http://wrzuca.cz/file/2441376492687/JListDemo.jar
Kod:
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.GridBagLayout;
import javax.swing.JTextField;
import java.awt.GridBagConstraints;
import javax.swing.JList;
import java.awt.Insets;
import javax.swing.JScrollPane;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
public class JListDemo extends JFrame {
private JPanel contentPane;
private JTextField textField;
private JList listaWyboru;
private DefaultListModel wyniki;
private String listaElementow[] = {"Zero", "Jeden", "Dwa", "Trzy", "Cztery", "Pięć", "Sześć", "Siedem", "Osiem", "Dziewięć", "Podaj jakąś wartość", "Podaj inną wartość"};
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
JListDemo frame = new JListDemo ();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public JListDemo () {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("DemoClass");
setSize(278, 300);
setLocationRelativeTo(null);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
GridBagLayout gbl_contentPane = new GridBagLayout();
gbl_contentPane.columnWidths = new int[]{219, 0};
gbl_contentPane.rowHeights = new int[]{0, 0, 0};
gbl_contentPane.columnWeights = new double[]{1.0, Double.MIN_VALUE};
gbl_contentPane.rowWeights = new double[]{0.0, 1.0, Double.MIN_VALUE};
contentPane.setLayout(gbl_contentPane);
textField = new JTextField();
textField.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent arg0) {
try {
String textStr = textField.getText();
int textInt = Integer.parseInt(textStr);
if (textInt >= 0 && textInt < 100) {
wyniki.removeAllElements();
for (int i = 0; i < 3; i++)
wyniki.addElement(listaElementow[i]);
} else if (textInt >= 100 && textInt <= 200) {
wyniki.removeAllElements();
for (int i = 3; i < 10; i++)
wyniki.addElement(listaElementow[i]);
} else {
wyniki.removeAllElements();
wyniki.addElement(listaElementow[11]);
}
listaWyboru.repaint();
} catch (NumberFormatException e) {
wyniki.removeAllElements();
wyniki.addElement(listaElementow[10]);
}
}
});
GridBagConstraints gbc_textField = new GridBagConstraints();
gbc_textField.insets = new Insets(0, 0, 5, 0);
gbc_textField.fill = GridBagConstraints.HORIZONTAL;
gbc_textField.gridx = 0;
gbc_textField.gridy = 0;
contentPane.add(textField, gbc_textField);
textField.setColumns(10);
JScrollPane scrollPane = new JScrollPane();
GridBagConstraints gbc_scrollPane = new GridBagConstraints();
gbc_scrollPane.fill = GridBagConstraints.BOTH;
gbc_scrollPane.gridx = 0;
gbc_scrollPane.gridy = 1;
contentPane.add(scrollPane, gbc_scrollPane);
wyniki = new DefaultListModel();
wyniki.addElement(listaElementow[10]);
listaWyboru = new JList();
listaWyboru.setModel(wyniki);
scrollPane.setViewportView(listaWyboru);
}
}
Pozdrawiam serdecznie